簡體   English   中英

免注冊 COM 互操作和相關程序集

[英]Registration-Free COM Interop and Dependent Assemblies

我們正在將基於 MFC 的大型應用程序與少數托管 (.NET) 加載項集成在一起。 與這些插件的通信是通過 COM 完成的。

從歷史上看,我們只是使用注冊表來使這些加載項(作為 COM 服務器)對應用程序可用。 但是,現在我們正在嘗試使用免注冊 COM 互操作來執行此操作。

我們希望這些插件能夠與應用程序運行所在的目錄分開存放在一個單獨的目錄中——最好是在任何地方。 但是,由於無法解析依賴程序集,我們顯然遇到了服務器對象的實例化問題,這些程序集也存在於 COM 服務器 DLL 的目錄中。

“老式”COM 互操作通過在加載目標程序集時使用 LoadFrom 上下文來處理此問題。 但是激活上下文機制似乎並沒有做到這一點。

有誰知道如何讓它工作? 目前尚不清楚我們是否可以在模塊的 SxS 清單中識別依賴程序集,或者我們是否可以以不同的方式創建激活上下文?

感謝您的任何想法/提示!

傑夫

希望我能理解這個問題,因為我不太熟悉 MFC 項目,也不是它的限制條件。 一個“眾所周知的”.NET 類有一個接口(在 MFC 應用程序中永久注冊),然后處理所有的激活和實例化?

羅德尼

當我查看使用 ClickOnce 和免注冊 COM 簡化應用程序部署的文章時,我注意到它們在應用程序清單中引用了免注冊 COM 對象 DLL 的文件名。 我猜這個文件名可以更改為包含目錄等。

其次,在“更復雜的示例”一節中,它們包含依賴的 COM 對象作為對其項目的引用,並將它們設置為孤立的。 也就是說,他們現在也是免費注冊的。 我的猜測是他們的路徑也可以更新。

有幾種方法可以解決這個問題。 第一步是確定失敗的原因。 這需要使用fuslogvw收集 Fusion 日志。 使用此日志,查找無法加載的托管 COM 服務器和依賴程序集 - 我們需要了解加載服務器的上下文,這將告知我們依賴程序集失敗的原因。

只要您能盡早獲得事件,“總是”有效的大錘解決方案是AppDomain.AssemblyResolve

根據應用程序和 COM 服務器的相對布局,另一種選擇是更新探測路徑

您是否使用 .net 框架注冊了中間(互操作)dll?

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm "path..\AxInterop.xxx.dll" 或 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm "path..\Interop .xxx.dll"

問候帕尼

打開您的 Visual Studio 命令提示符並嘗試使用 regasm 注冊您的程序集

regasm /tlb:"path"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM