C ++で記述された静的ライブラリを取得し、.NETプロセスがlibと1つのexeファイルに統合されるように、どういうわけかそれを.NETプロセスに統合することは可能ですか?
つまり、C#プロセス内からc ++ DLLを呼び出すことができますが、ユーザーはC ++ DLLを持っている必要がありますが、DLLの代わりにlibを使用することは可能ですか? exeが私のライブラリを使用していることさえ知っています)。そしてそれが可能であれば、どのように?
3 に答える
他のマネージド言語の中でもユニークなC++では、混合モードが可能です。同じコンパイルユニット(dll / exe / lib)内でマネージド(C ++ / CLI)とネイティブC ++を組み合わせて、呼び出しを行ったり来たりします。たぶんあなたはそれを活用して、一種の接着剤層を作ることができます。私は試したことがありません。
重要なのは/clrコンパイラスイッチです。プロジェクト内の一部のファイルに適用しますが、他のファイルには適用しません。次に、管理対象としていくつかのクラス/関数を作成します。アンマネージビットはそれらを認識して呼び出すことができ、その逆も可能です。プリミティブ型の受け渡しは透過的に行われます。文字列の場合、マーシャリングのトリックがいくつかあります。月曜日にもっと投稿できるようになります。
編集:いくつかの深い魔法が必要になるようです。混合C++側ではありません-結果をC#側にリンクします。Visual Studio IDEは、このシナリオを容易にサポートしていません。たぶん、通常のビルドプロセスは役に立たないでしょう。
EDIT2:コンパイラに/ LNコマンドラインオプションを指定し、リンカに/ NOASSEMBLYを指定することにより、C++ビットを.netmoduleにコンパイルできます。さて、それをC#exeにリンクするには...
私はビジュアル2008でそのようなことをしました(VCの新しいバージョンでまだ可能かどうかはわかりません)。だからそれは可能です。私の経験では、C# ではなく、ネイティブ C++ とマネージド C++ のみを混在させることができます。そのために、(私の場合は) ネイティブ C++ で記述されたいくつかのライブラリを含むソリューションを作成し、マネージ C++ で exe プロジェクトを作成し、プロジェクトに依存関係を追加しました。ただし、マネージド クラスにネイティブ型を直接混在させることはできないため、いくつかのラッピング マネージド C++ クラスを作成する必要があります。(「エラー C4368: 'nativeVar' をマネージド 'ManagedClass' のメンバーとして定義できません: 混合型はサポートされていません」のようなコンパイル エラーが発生します。
ライブラリで .NET を使用する理由がわかりませんが、個人的には .NET インターフェースを使用したかったのです。繰り返しになりますが、MFC または GUI ライブラリを備えたすべてのネイティブ C++ を使用します。
いいえ、これは完全に不可能です。混合モードは現在C++/ CLIで禁止されています-コードのすべてのビットは完全に.NETまたは完全にネイティブであり、境界を越える唯一の方法はP/InvokeとDLLを使用することです。