2011-03-22 81 views
1

工作,我有一個非託管C++/ATL進程內COM對象(Unmanaged.dll),我試圖從一個託管的C#DLL使用(Managed.dll )。不過,我想要使用免費註冊的COM。我把它歸結爲這些步驟:如何獲得免註冊COM的託管/非託管互操作

  • 在開發機器上註冊COM對象。進程內服務器必須具有正確註冊的類型庫。
  • 添加到C#項目中的COM對象的引用,然後將參考屬性設置爲隔離=真。

這產生了Unmanaged.dll,Managed.dll和Native.Managed.manifest。打開清單,很清楚系統如何使用它以無註冊方式加載COM對象。

這裏是擦。我有一個託管的EXE(Managed.exe),它動態加載Managed.dll來訪問公共類型。我的意思是「動態」,它使用Assembly.LoadFrom(「Managed.dll」)。當Managed.dll內部的代碼嘗試創建COM對象時,它會得到「類未註冊」異常。看起來,當Managed.dll加載時,激活上下文不能正確設置。

是否有一種方式來獲得免費的註冊COM在這種情況下工作嗎?沒有答案

回答

2

兩天,所以這裏是我想出在那個時候......

它確實看起來像激活上下文是建立基於關聯的清單在工藝推出的OS與主EXE。這意味着所有免註冊的COM相關元素必須在進程啓動時位於Main.exe.manifest中。這打破了EXE和DLL之間的隔離。如果一個DLL負責創建COM對象,那麼您不會期望EXE清單必須包含無reg的COM信息。您可能已經預期與DLL關聯的清單在DLL加載時合併到進程激活上下文中,但它不會。

要解決此問題,DLL必須創建COM對象之前配置一個新的激活上下文。更糟糕的是,目前(從.NET 4.0開始)沒有管理的方式來做到這一點。因此,該DLL必須的PInvoke以下Win32函數:

我包裹這些調用與調用CreateActCtx和管理類構造函數中的ActivationActCtx和IDisposable :: Dispose中的DeativateActCtx和ReleaseActCtx。

+0

而你得到這個工作?我有一個非常類似的問題:從受管DLL中使用regfree ActiveX,它由nUnit加載和運行,所以我無法真正破解應用程序清單。但ActCtx函數拒絕爲我工作,我可能錯過了一些簡單的... – Spike0xff 2011-08-30 22:23:07