2012-04-17 27 views
1

私は、グループの新しいC#プログラムで使用する必要があるネイティブC++ DLLを持っています。私はネイティブのC + +のDLLのC + +/CLIのラッパーを作成したいので、C#でそれらをインポートしてコンパイルすることができます。C++ネイティブDLLのC++/CLIラッパー

私が知る必要があるのは、dllファイルを最初にラッパーソースファイルにロードする方法です。 #using < ...とまったく同じことは、MSILの場合と同じですが、ネイティブC++ dllをロードする場合は同じです。

また、DLL内のオブジェクトと名前空間は、(論理的に)どのようにアクセスできるようになりますか?

EDIT:よう__declspec(dllimport) public class radar;:私は私のradar.dllから私のレーダークラスをエクスポートし、そしてこのようなVC++(CLI)のプログラムでそれをインポートする必要があるために

class __declspec(dllexport) radar 
{ 
    // declarations and definitions 
    ... 
}; 

を使用

その定義をC#にするには、VC++(CLI)で公開されていないので、C#でレーダーを見ることはできません。私はradar pos1();のように、VC++ DLLのコードにネイティブDLLのオブジェクトを使用したい場合でも、私が取得:

error C2512: 'radar' : no appropriate default constructor available

はどのようにこれを行うことができ、手元にあるだけでレーダー宣言を持ちますか?

終了EDIT。

ありがとうございました!

+0

なぜC++/CLIラッパーを作成する必要がありますか? C#からPInvokeを使ってネイティブDLLを呼び出さない理由はありますか? http://msdn.microsoft.com/en-us/library/aa446536.aspx – PeskyGnat

答えて

3

これは自動ですが、これはあなた自身ではありません。 C++/CLIプロジェクトのリンカ設定でネイティブDLLインポートライブラリ(.lib)を指定すると、追加の依存関係の設定が行われます。リンカは、DLL名への参照をC++/CLIアセンブリにリンクします。 C#コードでは、C++/CLIアセンブリのマネージ型を使用するとすぐに、アセンブリがロードされます。 WindowsはDLL内のネイティブDLL参照を認識し、自動的にロードします。

これは、Windowsが実際に実行時にネイティブDLLを実際に見つけることができる場合にのみ有効です。それらをEXEプロジェクトのビルドフォルダにコピーします。それは面倒です。ビルド後のイベントで、またはOutput Directoryにコピーするプロパティをtrueに設定してC#プロジェクトに追加することで、それを行うことができます。

+0

オクラホマ、私はこの時点で明示的にリンクしたいと思う方法が望ましいと思います。関数のアクセスに 'LoadLibrary()'と 'GetProcAddress()'を使いたいのですが、DLLにもたくさんのクラスがあります。自分のプログラムにクラスをインポートするにはどうしたらいいですか? – Haix64

+0

"たくさんのクラス"はこれをひどく実用的ではありません。明示的なリンクを可能にするためにCOMサーバーを作成することができます。 –

+0

このように、私たちが今まで話してきた方法は、アンマネージドDLLについて話すときにほとんど唯一のものです。そして、私はこの方法を与えてCOMとして書くべきですか? – Haix64

関連する問題