如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话

Posted

技术标签:

【中文标题】如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话【英文标题】:How to handle talking to VB6 ActiveX dll that has OCX dependencies from a .NET WPF application 【发布时间】:2021-07-05 11:22:21 【问题描述】:

我有一个依赖于 ComDlg32.ocx 的 VB6 ActiveX dll。此 ActiveX dll 是从 .NET 应用程序调用的。 ActiveX dll 有一个公共接口,该接口有 1 个方法,它打开一个表单,打开一个打开文件对话框(来自 ComDlg32.ocx)。 .NET 应用程序有一个按钮,它将调用此 ActiveX dll 方法。

当 ComDlg32.ocx 和 ActiveX dll 都注册(通过 regsvr32)时,这一切都有效,但我需要使用 RegFree COM 让它工作,至少对于 ActiveX dll 的依赖项。我为这个 ActiveX dll 创建了一个manifest file,但它似乎没有被读取。 ProcMon 没有引用清单文件,sxstrace 没有给我任何信息(当我解析 etl 文件时,实际上是一个空白文本文件)。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
    <assemblyIdentity name="DeployArchitectureTest" version="1.0.0.0" type="win32" processorArchitecture="x86"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
    <file name="COMDLG32.OCX">
        <typelib tlbid="F9043C88-F6F2-101A-A3C9-08002B2F49FB" version="1.2" flags="control,hasdiskimage" helpdir="" />
        <comClass clsid="F9043C85-F6F2-101A-A3C9-08002B2F49FB" tlbid="F9043C88-F6F2-101A-A3C9-08002B2F49FB" progid="MSComDlg.CommonDialog.1" threadingModel="Apartment" miscStatus="" miscStatusContent="recomposeonresize,onlyiconic,cantlinkinside,insideout,activatewhenvisible,invisibleatruntime,setclientsitefirst">
            <progid>MSComDlg.CommonDialog</progid>
        </comClass>
    </file>
</assembly>

我已经尝试了 dll 的外部清单以及嵌入清单,但仍然没有运气。我一定遗漏了一些东西,但我能找到的所有信息都在谈论如何为 exe 创建清单文件,但没有关于如何处理具有自身依赖关系的 ActiveX dll 的信息。

如果有人有任何信息,我将不胜感激。

【问题讨论】:

您是否在应用程序级别 (.exe) 定义了重定向?另见:***.com/a/12402461/403671 @SimonMourier 我不知道该怎么做。我确实看过 UMMM,但也无法让它以这种方式工作,但也许我错过了这个重定向步骤。关于如何做到这一点的任何想法? 通过重定向,我的意思是你在应用程序级别做到了这一点:docs.microsoft.com/en-us/dotnet/framework/interop/… 不是组件级别。或者确保清单存在于 exe 中。您可以使用 Visual Studio 并将其作为原始文件打开:social.msdn.microsoft.com/Forums/getfile/372689 您应该将其视为 RT_MANIFEST DLL 中的 regfree 清单在技术上是可行的,只要它使用资源 ID #2 并且 DLL 被操作系统加载。 C# 库也不属于这种情况,您无法更改 CLR 加载依赖程序集的方式。请记住,您必须安装 VB6 运行时支持模块,comdlg32.ocx 应该是其中的一部分。 您不需要应用程序清单而不是 DLL 清单吗? 【参考方案1】:

经过更多研究并被@SimonMourier 和@HansPassant 指出正确的方向后,我设法让这项工作发挥作用。

我认为如果我使用@HansPassant 提到的资源 ID #2,则可以使用 dll 清单,但我无法让它以这种方式工作。无论我做什么,似乎都没有读取 dll 清单。

然而,我确实发现将来自 dll 清单的所有清单数据包含到 exe 清单中,并确保 exe 没有嵌入式清单允许 RegFree COM 按预期工作。我发现 Visual Studio 正在使用嵌入式清单构建我的 .NET exe,即使项目中有一个 app.manifest 文件。我必须将 COM dll 设置为“isolated=true”,以便将清单构建为外部。

非常感谢@SimonMourier 和@HansPassant,你们的两位cmets 都让我找到了正确的解决方法。

【讨论】:

以上是关于如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话的主要内容,如果未能解决你的问题,请参考以下文章

如何处理与 AWS AppSync 离线同步的数据?

如何处理与 RestKit 的关系同步(离线支持)

如何处理与 python 套接字的断开连接? (连接重置错误)

如何处理与 Laravel 的复杂关系?

如何处理与派生类不兼容的基类方法?

如何处理与Apache HttpClient的无效SSL证书