いくつかの Com-visible インターフェイスとクラスを含む C# アセンブリがあります。このアセンブリは、厳密な名前のない 2 つのアセンブリに依存しており、他の方法で署名または変更することはできません。したがって、アセンブリを登録し、ネイティブ C++ ライブラリで使用する tlb ファイルを作成するには、これらのビルド後のコマンドを使用します。
"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" MyLib.dll /regfile /asmpath:"..\depencies\;C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0;c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727;c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5"
regedit /s MyLib.reg
"C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\tlbexp" MyLib.dll /asmpath:"../depencies" /out:MyLib.tlb
.h ファイルのネイティブ ライブラリに、次のような tlb ファイルを含めます。
#import "../Build/MyLib.tlb" no_namespace named_guids
extern ILinkVariableManager *LinkVariables();
cpp ファイルでは、CoCreateInstance が呼び出されるメソッドを実装します。
ILinkVariableManager *linkVariables = NULL;
ILinkVariableManager *LinkVariables(){
if(linkVariables!=NULL)
return linkVariables ;
HRESULT result2 = CoCreateInstance(CLSID_LinkVariableManager2,
NULL, CLSCTX_INPROC_SERVER,
IID_ILinkVariableManager, reinterpret_cast<void**>(&linkVariables));
return linkVariables;
}
クラスとインターフェイスにいくつかのメソッドを追加し、すべてのインターフェイスと c# アセンブリの GUID を変更するまで、すべてうまくいきました。ここで、CoCreateInstance は 0x80070002 エラーを返し、linkVariable 値を 0 に設定します。考えられる理由は 2 つあります。アセンブリの登録方法が間違っていて、初めてすべてが誤って機能したか、GUID の変更後に問題が発生しました (ただし、.tlh ファイルでは GUID は実際のものです)。