2010-05-28 62 views
4

當我登記我的.NET程序集與regasm.exe註冊表項Regasm mscoree.dll中寫入到註冊表項InprocServer32的

HKEY_CLASSES_ROOT \ CLSID {111E32AD-4BF8-495F-AB4D-6C61BD463EA4} \ InprocServer32的

設置爲「mscoree.dll」。

但是,我試圖模仿一個用C編寫的現有COM服務器。註冊這個舊的COM服務器時,InprocServer32被設置爲該組件的完整路徑。

不幸的是,現有的系統(我無法更改的插件主機)讀取並使用此值 - 「mscoree.dll」值會使其感到困惑。

我的解決方案可能是手動修補此註冊表項 - 但我想了解爲什麼regasm將「mscoree.dll」寫入InprocServer32。

回答

5

這個解釋很簡單。當您使用本機(非託管)COM服務器in-proc時,它會加載到使用者進程中,並且使用者進程會直接調用其功能。

使用託管代碼COM暴露的程序集時,這無法輕鬆工作。在託管代碼的情況下,需要執行託管/非託管交互的中間層。 mscoree.dll充當此中間層。因此,當消費者呼叫CoCreateInstance()mscoree.dll被加載並通過加載COM暴露的彙編託管代碼並將所有調用轉發給後者來模擬COM服務器。