1

私はC++で書かれたコード(私は書かなかった)を持っていて、それをC#で使用したいので、dllを作成し、そこからこのクラスを使用することにしました。

私はC++の知識がほとんどなく、C#プロジェクトでこのクラスのメソッドを参照する際に問題が発生しています。

C++コードは次のようになります。

#ifndef BeamAn_class
#define BeamAn_class
#define DllExport   __declspec( dllexport ) 
#include <vector>
#include <cmath>

using namespace std;

public class  DllExport BeamAn
{
  public:
    BeamAn();
    ~BeamAn();  
    bool SetGeometry(vector<double>); //I didn't put the DllExport here because I already did it for the whole class. It's okay to do this, right?
    //other public methods an stuff
  private:
    //private methods an stuff
}
#endif

私のC#プロジェクトでは、通常、C ++ dllへの参照を追加しました(プロジェクトを右クリックして、参照を追加します。.libファイルと.hファイルはdllの同じフォルダーにあります)。

しかし、VisualStudioは私のクラスのメソッドを「見る」ことができないようです。BeamAnタイプのオブジェクトを作成できますが、そのメソッドを使用できません。たとえば、次のように実行できます。BeamAn contBeam = new BeamAn(); ただし、次のように、クラス内でメソッドやアトリビュートを使用することはできません。contBeam.SetLoadFactors(1.0,1.2);

Visual Studioによると、「BeamAnには「SetLoadFactors」の定義が含まれておらず、最初の引数タイプ「BeamAn」を受け入れる拡張メソッド「SetLoadFactors」が見つかりませんでした(usingディレクティブまたはアセンブリ参照がありませんか?)

dllを正しく機能させるためにC++コードに書き込む必要のあるものは他にもありますか、それとも参照時に何か間違ったことをしていますか?明示的にリンクしている場合は、C#コードで「DllImport」を使用する必要があることはわかっていますが、それは私がやりたいことではありません。

どうもありがとうございます!

4

2 に答える 2

2

C ++ライブラリをC#で使用できるようにする方法はいくつかあります。

  1. PInvokeを使用します-C++コードを直接呼び出します。詳細については、この記事を参照してください。一般的なリファレンスについては、 pinvoke.netも参照してください。
  2. 相互運用言語を使用して、アンマネージコードのマネージラッパーを作成します。Microsoftの世界にいる場合は、混合モードライブラリ(マネージコードとアンマネージコードの両方を含むdll)を作成するためにC ++/CLIをお勧めします。これは、C ++ / CLIを紹介する簡単な(そして古い)記事です
  3. C++COMにアクセスできるようにします。コードはあなたのものではないので、これはあなたにとって役に立たないかもしれません。C ++とCOMの詳細については、この投稿を参照してください。

単純なシナリオでは、PInvokeがおそらく最も簡単です。マネージドコードとアンマネージドコードのより複雑な相互作用については、相互運用言語を使用して混合モードdllを作成することをお勧めします。そして、それらがうまくいかない場合は、COMを使用してください。

発生したエラーに対処するために:C#プロジェクトからC ++ライブラリへの参照を追加することはできません-それらは完全に異なる言語であり、異なるメモリ管理システム、異なる型システム、異なるすべて(まあ、多くのもの)があります。また、データ構造(ベクトル、マップ、セットなど)をアンマネージコードからマネージコードに渡すことはできません。

于 2012-04-16T03:10:21.707 に答える
0

ac#プロジェクトでc ++コードを使用するには、次の2つのオプションがあります。

  1. c++クラスをマネージC++クラスでラップします
  2. swigというライブラリを使用する

興味があるかもしれないリンク:Visual C ++をC#でラップする

于 2012-04-16T02:44:16.760 に答える