0

c# で c++ dll をラップすることについて少し混乱しています。どの種類の dll を作成すればよいですか? 通常の dll または mfc dll ですか? すべてのプロトに「extern...」というプレフィックスを付ける必要がありますか? 関数をdefファイルに書くべきですか?

私の最後の努力は無駄でした。C# は「bad image format」のようなエラーでクラッシュします。これは、dll 形式が正しくないことを意味しますか?

どんな助けでも大歓迎です。

前もって感謝します :-)

4

4 に答える 4

4

64 ビット PC を使用していますか?

x64 コードと x86 コードを混在させようとすると、x64 システムで「Bad image format」が発生します。これは、アンマネージ DLL (おそらく既定では x86) を呼び出す C# コード (「任意の CPU」を対象とするため、x64 コードに jit コンパイルする) を作成した場合に発生します。

これに対する 2 つの解決策は次のとおりです。

  • (適切な解決策) dll が x64 をターゲットとするようにコンパイルされていることを確認して、プログラム全体をネイティブ 64 ビット アプリとして実行できるようにするか、または
  • (下位互換性ソリューション) アプリケーション全体を強制的に x86 アプリとして実行します。C# プロジェクトのプロパティで、Build "Any CPU" 設定を "x86" に変更します。

それ以外の場合は、通常の COM dll を作成し (MFC の有無は関係ありません)、RCW (ランタイム呼び出し可能ラッパー) でラップするだけです。

于 2009-11-25T06:59:56.943 に答える
2

通常の種類の C++ dll を作成し、C# コードから相互運用することができます。

使用できるチュートリアルを次に示します。

于 2009-11-25T06:58:30.177 に答える
1

C++/CLI を使用して .NET dll を作成してみてください。.NET-Dll は C# で使いやすく、c++-dll にネイティブにアクセスできます。これが、MOGRE が OGRE のラッパーを作成する方法です。

確かなことはわかりませんが、SWIGがこの作業に役立つかもしれません。私はそれを使ったことはありませんが、ラッパーの作成によく使用されます。

于 2009-11-25T06:36:47.800 に答える
0

たとえば、MFC アプリケーションにプラグインする必要がある場合など、COM/MFC dll であることが本当に必要でない限り、それをストレートな C++ .dll にすると、より明確になる可能性があります。

extern キーワードに関するご質問への回答として、.lib ファイルを含める場合、これは呼び出し元のアプリケーションでのみ使用されると思います。

これは、ストレート C++ dll の作成に関するチュートリアルです

DLL を取得すると、問題は、DLL 内のアンマネージド コードと C# アプリケーション内のマネージド コードを扱っているという事実になります。つまり、C++ は C# で使用されるマネージド型について何も知らないため、同様に、C# は C++ dll で使用される型のメモリを処理する方法がわからないため、dll でメモリを管理するのはユーザー次第です。C# ガベージ コレクターは、C# アプリケーション内のメモリのみを処理できます。

答えは、C++ で「通常の」dll を作成し、C++/CLI でそのラッパーを作成して、すべてのメモリ管理と、C++ アンマネージ型から C# 型への変換、およびその逆の変換を行うことだと思います。marshalこのクラスを使用して、マネージド型 (C#) とアンマネージド型 (C++) を変換する必要がある場合があります。次に、C++ dll を直接インポートするのではなく、C++/CLIラッパーをインポートします。ラッパーが「ブリッジ作業」を行っているため、関数の呼び出しは C# アプリケーションで簡単になります。

私はサードパーティの C++ dll で同様のことを行いましたが、これは思ったほど悪くはないと思います。

これを行う方法に関するチュートリアルを次に示します。

于 2009-11-25T10:06:53.900 に答える