2010-10-24 111 views
4

我想在我的代碼中實現註冊表免費的COM explicilty(不能使用註冊表免費的COM通過應用程序清單,因爲它只能在exe級別):我創建一個靜態類加載COM DLL,調用DllGetClassObject,然後IClassFactory :: CreateInstance()。默認IMarshal實現?

工作得很好。實現細節在http://www.dimastr.com/redemption/security.htm#redemptionloader

但是,如果我從多個線程實例化我的COM對象(例如第一個在主線程,然後從第二個),.Net開始要求我的對象IMarshal,我沒有實現。

如果在註冊表中註冊COM庫,一切工作正常。如果庫沒有在註冊表中註冊(這是所有這一切的重點),.Net要求IMarshal。

有沒有什麼辦法可以得到COM內部使用的默認實現IMarshal?或者如果我的對象不實現IMarshal,防止它失敗?

謝謝!


+0

嗯,是什麼讓你相信reg free com「only」在exe級別上工作? – 2010-10-24 07:38:43

+1

因爲COM系統從父進程exe中查找應用程序清單。它不可能知道一個調用來自一個DLL,所以它需要從主機EXE以外的可執行文件中檢索資源。而且我的COM庫可以被另一個DLL(例如Outlook加載項)加載。 – 2010-10-24 15:34:18

回答

4

CoGetStandardMarshal用於獲取默認實現;然而這種方法沒有文檔 - 你必須四處搜尋才能得到它的原型。

但是,如果您沒有提供IMarshal接口,則使用default implementation。因此,我認爲問題在於別處。

+0

是的,我最終使用了CoGetStandardMarshal - 一旦我做到了,它就完美地運行了。 謝謝! – 2010-11-14 04:57:23

+1

如果接口未在註冊表中註冊,則不使用默認IMarshal。這是一個.Net特定的問題 - 我從DllGetComServer返回了相同的IClassFactory,並且.Net將它與IClassFactory進行了比較,它已經從一個不同的線程調用了。然後將該調用編組到該線程,如果IMarshal不是explicklty返回,那麼.NET將被阻塞。使用Marshal.ReleaseCOMOBject()完成後,忘記IClassFactort immediatley。解決了問題。 – 2010-11-14 04:57:51