我有带有几个 Com-visible 接口和类的 C# 程序集。该程序集依赖于两个没有强名称的程序集,不能以任何其他方式对其进行签名或修改。因此,要注册程序集并创建 tlb 文件以在本机 c++ 库中使用,我使用这些构建后命令
"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。我在这里看到两个可能的原因:我的程序集注册方式不正确,第一次全部工作意外或 guid 更改后出现问题(但在 .tlh 文件中,guid 是实际的)。