C# を使用して、.Net Framework で登録不要の COM オブジェクトを作成する必要があります。
MSDN ウォークスルーに従いました。または、私には十分に明確ではないか、正しくないため、私はそれに取り組む必要がありますが、これは古い投稿であり、Windows 10 で Visual Studio 2015 を使用しているため、何かが変更されている可能性があります。
以下に、それを機能させるために行った手順を示します。
COM C# dll
SideBySide.dll
(Target Framework 2.0) をコンパイルします。もちろん、regasm で登録していません。チュートリアルで説明されているアプローチは使用していません。うまくいかないようです。で作成
SideBySide.Manifest
しますmt.exe
。コマンドは次のとおりです。mt -outputresource:"<path SidebySide.dll>" -manifest "<SideBySide.manifest>"
生成されたマニフェストを手動で変更して、役に立たないタグをすべて削除し、必須のタグを追加しました。変更されたマニフェストは次のとおりです。
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity name="SideBySide" version="1.0.0.0" type="win32" /> <clrClass clsid="{4B72FC46-C543-4101-80DB-7777848D1357}" progid="SideBySide.SideBySideClass" threadingModel="Both" name="SideBySide.SideBySideClass" runtimeVersion="v2.0.50727"> </clrClass> <file name="SideBySide.dll"> </file> </assembly>
SideBySide.dll
次のコマンドでマニフェストを追加しました。mt -outputresource:"<Path SidebySide.dll>" -manifest "SideBySide.manifest"
SideBySide.dll using
tlbexp`から TLB をエクスポートしました。C++ クライアントの構成でNoを設定しました。
Properties -> Manifest tool -> Embed Manifest
をコンパイル
client.exe
し、client.exe.manifest
ファイルに変更を適用しました。変更されたマニフェストは次のとおりです。<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <assemblyIdentity type = "win32" name = "client" version = "1.0.0.0" /> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="SideBySide" version="1.0.0.0" /> </dependentAssembly> </dependency> </assembly>
すべてがうまく機能しており、ネイティブ C++ アプリケーションから .Net Framework COM インターフェイスを使用できるようです。
SideBySide.dll
ただし、 .Net Framework 4.0 以降でコンパイルしようとすると、次の呼び出し時に問題が発生しますCreateInstance
。
ISideBySideClassPtr ptr;
HRESULT hr = ptr.CreateInstance(__uuidof(SideBySideClass));
このエラーが発生します:
0x8013101b : このアセンブリは、現在読み込まれているランタイムよりも新しいランタイムによってビルドされているため、読み込むことができません。
もちろん、上記のすべての手順を実行しようとしましたが、DLL のマニフェストでランタイム バージョンも指定しようとしましたが、役に立ちませんでした。
この投稿も読みました。問題は同じですが、ネイティブ クライアントから C# COM オブジェクトを呼び出す必要があるため、私の意見では、解決策は私には適していません。
適用する回避策はありますか、それとも問題に対して別のアプローチが必要ですか?