2017-01-19 13 views
1

私は、複数のdll C++ DLLをそれぞれの元のC++ dllを別のC#dllでラップしようとC#でラップするプロジェクトに取り組んでいます。私は、C++ライブラリAのいくつかの共通シンボルがC++ライブラリBとCで使用されている場合、ラップすることは不可能であるという問題に遭遇しました。これはC++の非常に頻繁なシナリオであるため、私は明らかに何かが間に合わないと思います。数日を過ごしても、私はまだ失われており、どのように進むべきかについての助けに感謝します。クラスPoint ライブラリで定義されるようになっている - - ライブラリで定義されているものとするクラスQuadrange - クラストライアングルは、ライブラリBに定義されていることになっている を使用しています は:複数のC++ .dllを複数のC#.dllでラップする

次の簡単なサンプルでは、​​問題を再現します

"MyPoint.h" 
class MyPoint 
{ 
public: 

    MyPoint(double theX, double theY) : myX(theX), myY(theY) {} 

    double X() const { return myX; } 
    double& X() { return myX; } 

    double Y() const { return myY; } 
    double& Y() { return myY; } 

private: 

    double myX; 
    double myY; 
}; 

"MyTriangle.h" 
#include "MyPoint.h" 

class MyTriangle 
{ 
public: 

    MyTriangle(const MyPoint& theP1, const MyPoint& theP2, const MyPoint& theP3) : 
     myP1(theP1), 
     myP2(theP2), 
     myP3(theP3) {} 

    MyPoint P1() const { return myP1; } 
    MyPoint& P1() { return myP1; } 

    MyPoint P2() const { return myP2; } 
    MyPoint& P2() { return myP2; } 

    MyPoint P3() const { return myP3; } 
    MyPoint& P3() { return myP3; } 

private: 

    MyPoint myP1; 
    MyPoint myP2; 
    MyPoint myP3; 
}; 

"MyQuadrangle.h" 
#include "MyPoint.h" 

class MyQuadrangle 
{ 
public: 

    MyQuadrangle(const MyPoint& theP1, const MyPoint& theP2, const MyPoint& theP3, const MyPoint& theP4) : 
     myP1(theP1), 
     myP2(theP2), 
     myP3(theP3), 
     myP4(theP4) {} 

    MyPoint P1() const { return myP1; } 
    MyPoint& P1() { return myP1; } 

    MyPoint P2() const { return myP2; } 
    MyPoint& P2() { return myP2; } 

    MyPoint P3() const { return myP3; } 
    MyPoint& P3() { return myP3; } 

    MyPoint P4() const { return myP4; } 
    MyPoint& P4() { return myP4; } 

private: 

    MyPoint myP1; 
    MyPoint myP2; 
    MyPoint myP3; 
    MyPoint myP4; 

}; 

三角形と四角形はそれぞれ3点と4点で設定されています。 したがって、両方のクラス(MyTriangleおよびMyQuadrangle)はMyPointクラスを使用します。 C:swigwin-3.0.10 \ swigwin-3.0.10 \コマンド・ライン・インターフェースは、各ファイルのために書かれた

"MyPoint.i" 
%module MyPointWrapper 
%{ 
#include "MyPoint.h" 
%} 
%include <windows.i> 
%include "MyPoint.h" 

"MyTriangle.i" 
%module MyTriangleWrapper 
%{ 
#include "MyTriangle.h" 
%} 
%include "MyPoint.i" 
%include "MyTriangle.h" 

"MyQuadrangle.i" 
%module MyQuadrangleWrapper 
%{ 
#include "MyQuadrangle.h" 
%} 
%include "MyPoint.i" 
%include "MyQuadrangle.h" 

:自分のインターフェイスファイルを持っている すべての3つのクラスは、クラスのseparately.Forそれぞれに包まれています\ swig -csharp -C++ -namespace geometry -outdir C:\ Geometrics \ MyPointNet \ Generated MyPoint.i C:\ swigwin-3.0.10 \ swigwin-3.0.10 \ swig -csharp -C++ -namespace geometry -I "C :\ Geometrics \ MyPointcpp "-outdir C:\ Geometrics \ MyTriangleNet \ Generated MyTriangle.i C:\ swigwin-3.0.10 \ swigwin-3.0.10 \ swig -csharp -C++ -namespace geometry -I" C:\ Geometrics \ MyPointcpp "-outdir C:\ Geometrics \ MyQuadrangleNet \ Generated MyQuadrangle.i

私はC#でMyPointクラスを使用します。

using System; 
using geometry; 

namespace Example 
{ 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       MyPoint P = new MyPoint (3, 4, 5); 
      } 
     } 
} 

エラーは、各クラスがMyPointの種類が含まれていることを言うこと表示されます。 タイプは「MyPoint」「MyTriangleNet、バージョン= 1.0.0.0の両方に存在します、Culture = neutral、PublicKeyToken = null ' と' MyPointNet、Version = 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null '

このような状況を回避するにはどうすればよいのですか?それぞれのクラスが別々にラップされるという条件ですか?

+0

私は質問をロールバックしました。あなたが行った編集は、C#/ Windowsの知識が不足しているためにテスト/回答に誤りがあったのですが、あなたの質問には(非常に良い)詳細がありませんでした。インタラクティブなデバッグセッションよりも百科事典のエントリ。 – Flexo

答えて

0

あなたは、ほとんどが単にあなた.iのファイルになるので、より多くのあなたが、%import "modulename.i"代わりの%includeを使用する必要が発生することなく、既存のコードを参照するために、そこにそれを持っている:

MyPoint.i:

%module MyPointWrapper 
%{ 
#include "MyPoint.h" 
%} 
%include "MyPoint.h" 

MyQuadrangle.i:

%module MyQuadrangleWrapper 
%{ 
#include "MyQuadrangle.h" 
%} 
%import "MyPoint.i" 
%include "MyQuadrangle.h" 

MyTriangle.i:

%module MyTriangleWrapper 
%{ 
#include "MyTriangle.h" 
%} 
%import "MyPoint.i" 
%include "MyTriangle.h" 

私はC#のエキスパートではありません。そのため、%typemap(csimports)などを使用する必要があります。 MyTriangle。CSは、それが非修飾名を使用してを指しMyPointタイプを参照する方法を知っていたが、私は必要とされていないようでした、単一の実行可能ファイルを構築Linux上のMonoでそれをテストし、少なくともとき:

#!/bin/bash 
swig3.0 -csharp -c++ -namespace geometry -outdir MyPointNet MyPoint.i 
swig3.0 -csharp -c++ -namespace geometry -outdir MyTriangleNet MyTriangle.i 
swig3.0 -csharp -c++ -namespace geometry -outdir MyQuadrangleNet MyQuadrangle.i 

g++ -Wall -Wextra -o libMyPointWrapper.so MyPoint_wrap.cxx -shared -fPIC 
g++ -Wall -Wextra -o libMyQuadrangleWrapper.so MyQuadrangle_wrap.cxx -shared -fPIC 
g++ -Wall -Wextra -o libMyTriangleWrapper.so MyTriangle_wrap.cxx -shared -fPIC 

mcs run.cs */*.cs && ./run.exe 

すべて加工さ私があなたのサンプル使用法を変更して、存在していたMyPointのコンストラクタを呼び出すようにしたら(2-arg)正しくあなたはa little more work, as outlined in the documentation, to changeinternalからpublicへの内部の一部の可視性を行う必要があります複数のアセンブリ間でこの作業を行うためにさらに

MyTriangle T = new MyTriangle(P,P,P); 

:私はまたにMyTriangleのための簡単なテストを追加しました。ドキュメントはちょうどそれが公表するよりも、いくつかの優れた回避策を提案することを

%module MyPointWrapper 
SWIG_CSBODY_PROXY(public, public, SWIGTYPE) 
SWIG_CSBODY_TYPEWRAPPER(public, public, public, SWIGTYPE) 
%{ 
#include "MyPoint.h" 
%} 
%include "MyPoint.h" 

注:このインスタンスでMyPoint.iになるので、あなただけの、インポートされ、この内部のモジュールを行う必要があります。それが私の制作コードだったら、私はそれらを調べるでしょう。

+0

ありがとう、ヒントを提供しています。 Triangle.iファイルに%モジュールを追加した後、Triangle(Qudrangleと同じ)用に生成されたコードから、MyPointクラス のメソッドへのアクセスの問題が発生しました。元の投稿は詳細で編集されました。 – KKirill

+0

@KKrill '-Wall'でSWIGを実行すると、' internal'がC#の予約語であることがかなり警告されます。私の推測では、それはそれに関連するものです。 – Flexo

+0

実際には多分そうではないかもしれませんが、これまでに経験したことのないC#モジュールのようです。もう少し掘り下げます。 – Flexo

関連する問題