2

この質問は、前の質問: Create DLL from unmanaged C++の続きですが、この新しい質問を理解するためにそれを読む必要はありません。

現在、いくつかの関数で構成されるアンマネージ C++ コードを含む DLL があり、そのうちの 1 つだけを外部で使用するためにエクスポートしています。次に、Managed C++ プロジェクト (共通言語ランタイム サポートでビルド) でこの DLL を使用する必要があります。Additional Include Directoriesこれまでのところ、 Visual Studio 2010 でを設定して、既存のアンマネージド プロジェクトのヘッダー ファイルへの参照を追加しました。

ここで DLL ファイルへの参照を追加しようとするとMyManagedProject > Properties > Common Properties > Add New Reference > Browse > MyUnmanagedDLL.dll、エラーが発生します。Could not add a reference to file MyUnmanagedDLL.dll because it is neither a .NET assembly nor a registered ActiveX control. ただし、前述の DLL を取得して、マネージ C++ の実行可能ファイルと同じフォルダーにコピーすると、すべて正常に動作します。

ハック的な解決策のように見えるため、これが正しい方法であるかどうかはわかりません。また、ソース コードを変更するたびに DLL をコピーする必要があります。

私の問題を要約するには:

  1. アンマネージ C++ コードで構成される DLL を作成しました。これを と呼びましょうMyUnmanagedDLL.dll。この DLL のヘッダー ファイルも作成しました。
  2. マネージ C++ プロジェクト (CLR) があります。それを呼び出しましょうMyManagedProject.vxproj
  3. でどのように使用できMyUnmanagedDLL.dllますMyManagedProject.vxprojか? それを参照する正しい方法はありますか、それとも同じディレクトリにコピーするだけMyManagedProject.exeですか? (これは機能しますが、良い習慣かどうかはわかりません...)

追加情報: Windows 7、Visual Studio 2010 Ultimate、CMake 2.8.10.2

4

2 に答える 2

8

アンマネージ DLL をマネージ C++ プロジェクトへの参照として追加することはできません。これは、マネージ DLL でのみ行うことができます。代わりに、アンマネージ C++ プロジェクトでアンマネージ DLL にリンクするのと同じ方法で、アンマネージ DLL にリンクします。

  • コンパイルにはヘッダー ファイルを使用します。
  • アンマネージ DLL の .lib ファイルをリンカーに提供します。たとえば、リンカー構成ページの [追加の依存関係]リストにファイルを追加します。
  • ローダーが見つけられるように、DLL を実行可能ファイルと同じディレクトリに配置します。
于 2013-01-24T09:18:09.550 に答える
1

どうやら、唯一の解決策は、DllImport 属性で装飾されたメソッドでアンマネージ dll パスを渡すことです。

適切な方法で物事を維持するためにできることは、管理されていない dll を配置する lib フォルダーを作成し、それらのプロパティ ''出力ディレクトリにコピー'' を ''常にコピー'' としてマークすることです (管理されていない dll を右クリックし、 >プロパティ->出力ディレクトリにコピー: 常にコピー)。

メソッドの DllImport 属性で、パラメータを「lib/unmanaged.dll」として指定する必要があります。C# では、次のようになります。

[DllImport("lib/testLib.dll")]
private static extern int DisplayHelloFromDLL();

このアプローチは以前の回答と違いはありませんが、コードをもう少しきれいに保つのに役立ちます。

于 2013-07-02T19:50:30.460 に答える