2013-11-04 51 views
1

我有幾個Com-visible接口和類的C#程序集。這個程序集依賴於沒有強名稱的兩個程序集,不能用任何其他方式進行簽名或修改。因此,註冊組裝和使用本機C創建TLB文件++庫我使用這些生成後命令執行CoCreateInstance時COM錯誤0x8007002(找不到文件)

"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; 
} 

所有工作得很好,直到我說了一些方法,類和接口,改變了GUID的所有接口和c#程序集。現在,CoCreateInstance返回0x80070002錯誤,並將linkVariable值設置爲0.我在這裏看到兩個可能的原因:我的程序集註冊方式不正確,第一次在GUID改變(但在.tlh文件GUID是實際的)後意外地出現了問題或者出現了問題。

回答

1

問題通過加入/基本代碼參數regasm.exe生成後命令調用解決。 0x80070002錯誤信號通知MyLib.dll缺少文件路徑。

0

如果您添加更多類型或更改了C#中類的GUID,您應該取消註冊您的C#DLL,然後使用/ tlb選項再次註冊它並使用tlb編譯C++ DLL。

取消註冊:C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /u mydll.dll

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

+0

我剛剛創建了新項目,那裏有一個簡單的類,並試圖在新的C++本地項目中使用它,但CoCreateInstance返回相同的錯誤。 – FLCL

+0

regasm是否可用於註銷沒有強名稱的程序集,該程序不在緩存中? – FLCL

+0

是的,您不需要將該DLL放入GAC。如果程序集不是強名稱,它將嘗試在exe路徑中找到它 – Matt