c# - 如何处理与 .NET WPF 应用程序具有 OCX 依赖项的 VB6 ActiveX dll 的对话
问题描述
我有一个依赖于 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 创建了一个清单文件,但它似乎没有被读取。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 的信息。
如果有人有任何信息,那么我将不胜感激。
解决方案
经过更多的研究并被@SimonMourier 和@HansPassant 指出了正确的方向,我设法让这个工作正常进行。
我认为如果我使用@HansPassant 提到的资源 ID #2,那么 dll 清单是可能的,但我无法让它以这种方式工作。无论我做什么,似乎从未读取过 dll 清单。
然而,我确实发现将 dll 清单中的所有清单数据包含到 exe 清单中,并确保 exe 没有嵌入式清单允许 RegFree COM 按预期工作。我发现 Visual Studio 正在使用嵌入式清单构建我的 .NET exe,即使项目中有一个 app.manifest 文件。我必须将 COM dll 设置为“isolated=true”,以便将清单构建为外部。
因此,感谢@SimonMourier 和@HansPassant,您的两条评论都让我找到了正确的解决方法。
推荐阅读
- java - 如何在java中使用TThreadedSelectorServer的TBufferedTransport
- cmd - 使用 BAT 文件作为 NSSM 服务
- java - Java-8 流:转换 List<{String,List
}> 到地图 > - java - Robotframework Appium - 当前未设置 JAVA_HOME
- symfony - 修改引导数据表
- javascript - 为什么 headerTransparent 和自定义参数 headerTitle 不能一起工作?
- salesforce - 在 LWC 中重新加载导航选项卡
- wpf - 适合 WPF Mvvm 中的窗口
- postgresql - 尝试在一个连接到另一个 postgres 的容器中运行 go 程序时出现拨号错误(拨号 tcp 172.18.0.2:8001:连接:连接被拒绝)
- elasticsearch - 从 Elasticsearch 中删除数据 Maxed out index