1

いくつかの 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 は実際のものです)。

4

2 に答える 2

0

C# でさらに型を追加したり、クラスの GUID を変更した場合は、C# DLL の登録を解除してから、/tlb オプションを使用して再度登録し、tlb を使用して C++ DLL をコンパイルする必要があります。

登録解除:C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u mydll.dll

登録者: C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe/tlb mydll.dll

于 2013-11-04T13:07:23.150 に答える