2011-06-15 39 views
4

我在位置A運行的.Net客戶端中使用激活上下文API以在位置B中加載一個無reg的COM組件(它與A完全不同的位置,而不是兄弟/後代等在同一臺機器上)通過在ACTCTX中的位置B傳遞,並且它工作正常。在不同位置使用激活上下文API與許多dll

但是,我現在需要對另一個COM DLL做同樣的事情,而這個DLL又依賴於一些生活在完全不同位置的.Net COM程序集。

我已經將相關的.Net程序集添加到清單中,並將清單和COM dll放在位置B中,但是我必須將相關的.Net程序集放在位置A(客戶機運行的位置)以使其運行。在現實中,他們將住在完全不同的目錄中,以位置A和位置B.

是我試圖做的可能,即是否有可能使用激活上下文api在不同的不相關的目錄中加載多個COM組件?

+1

非常令人懷疑,激活上下文中唯一的.NET意識是清單中的''元素。聽起來不適用。 GAC或AppDomain.AssemblyResolve是解決方法。在regfree COM中不使用本地部署通常是一個錯誤。 – 2011-06-15 12:50:00

回答

4

.NET查看活動和進程激活上下文以發現免註冊的元數據(<clrClass>等),就像本地COM一樣。但是,與本地COM不同,它不使用激活上下文中包含的信息來確定實際文件的位置。在那裏,我相信它只看到GAC,其次是僅位於客戶端EXE旁邊的文件位置。您可以使用Sysinternals Procmon來確認。我想你可以嘗試Hans提出的解決方法,或者手動將所需的程序集手動加載到你的程序中,看看是否有效;我沒有得到嘗試,因爲在我的情況下,客戶端EXE是一個本地EXE,我沒有控制。

+1

您確定.NET查看進程默認激活上下文嗎?如果我創建一個激活上下文並將其設置爲進程默認值,那麼我激活第二個激活上下文(即使第二個激活上下文爲空),但我無法實例化其「」處於第一個激活上下文中的對象。普通的'Assembly.Load'工作正常。 – 2012-10-09 09:07:16

+1

關於我的評論:它看起來像在.NET中缺少功能(激活第二個激活上下文隱藏了進程默認激活上下文)。 https://connect.microsoft.com/VisualStudio/feedback/details/766699/clr-only-looks-at-current-activation-context-when-asked-to-create-a-com-object – 2013-07-15 08:40:02