2011-07-18 69 views
0

我的全球目標是創建一個基於COM的應用程序,其中客戶端部分是C++代碼和服務器部分 - C#。它看起來很簡單。無法創建C#COM對象(類未註冊)

我嘗試從MSDN使用示例: http://msdn.microsoft.com/en-us/library/aa645738(v=vs.71).aspx

我做了兩個項目(使用VisualStudio2008)和編譯的解決方案。好。

我手動註冊組件。 (ref1)

但是,當我運行一個客戶端應用程序時,CoCreateInstance返回HRESULT「Class not registred」。

在步驟(REF1)

我嘗試使用:

1)regasm server.dll /tlb:server.tlb(今CPP源文件名是兼容的,原因)(從MSDN)

2)regasm server.dll /tlb:server.tlb GACUTIL /我server.dll

3)regasm /基本代碼/ TLB server.dll

在註冊表中看到我的課,但「默認值「InprocServer是mscore.dll。與其他註冊表筆記相比,它看起來像是錯誤的。 我試着手動編輯這個值 - 沒有結果。

但我很確定,這個樣本的工作原理!一旦我做了很多很多不同的動作而沒有改變GUID和...它很有效!但是我改變了GUID,嘗試註冊 - 沒有結果。我不能重複這種情況。魔術...

請幫助我!我需要一個確切的alhoritm沒有改變源(optionnal),沒有在註冊表中手動工作(在我的情況下完全不可能)。

//對不起,mb我的英文不完美。

+0

mscore.dll的InprocServer值是正確的。 –

回答

4

在註冊表中看到我的課,但InprocServer的「默認值」是mscore.dll

不,這不是一個錯誤。 Mscoree.dll是CLR的引導程序,它確保CLR已正確加載並初始化,以允許託管代碼在沒有CLR支持的本機應用程序中運行。它提供了COM服務器必須提供的DllGetClassObject入口點。託管程序集沒有像DllGetClassObject那樣具有本地導出的通用方法。

您應該在您的開發機器上使用/ codebase選項運行regasm.exe,因此您不必在gacutil.exe中將程序集註冊到GAC中。你已經嘗試過了。您現在只是註冊表問題,本機程序找不到您使用Regedit.exe找到的註冊表項。這是一個非常常見的原因,在64位操作系統上運行。如果COM客戶端是32位程序,則應使用32位版本的Regasm.exe(來自Framework,而不是Framework64)。以便註冊信息進入HKLM \ Software \ Wow6432Node \ Classes \ CLSID而不是HKLM \ Software \ Classes \ CLSID。 Wow6432Node是不同之處,這是32位註冊的主頁。

當所有其他都失敗時,使用SysInternals的ProcMon實用程序。它可以讓你看到本地程序在註冊表中搜索註冊鍵的位置。

+0

謝謝,漢斯,它工作。問題是我的命令行使用命令「regasm」64版本。 – CGSG11

0

我想你應該嘗試的路線: regasm /codebase server.dll /tlb server.tlb