如何从.NET WPF应用程序中处理与具有OCX依赖项的VB6 ActiveX dll进行通信

3
我有一个VB6 ActiveX dll,它依赖于ComDlg32.ocx。这个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的信息。
如果有人有任何信息,我将非常感激。

1
你在应用程序级别(.exe)定义了重定向吗?还可以参考这个链接:https://stackoverflow.com/a/12402461/403671 - Simon Mourier
@SimonMourier 我不知道该怎么做。我确实看过UMMM,但也无法通过那种方式使它工作,但也许我错过了这个重定向步骤。你有关于如何解决这个问题的任何想法吗? - Tom McKeown
1
通过重定向,我只是指你是否在应用程序级别上完成了这个操作:https://learn.microsoft.com/en-us/dotnet/framework/interop/configure-net-framework-based-com-components-for-reg 而不是组件级别。或者确保清单存在于exe中。您可以使用Visual Studio将其作为原始文件打开:https://social.msdn.microsoft.com/Forums/getfile/372689 您应该将其视为RT_MANIFEST。 - Simon Mourier
1
一个在DLL中使用regfree清单技术上是可能的,只要它使用资源ID#2,并且该DLL被操作系统加载。对于C#库来说情况并非如此,您无法改变CLR加载相关程序集的方式。请记住,您必须安装VB6运行时支持模块,comdlg32.ocx应该是其中的一部分。 - Hans Passant
1
你不需要一个 DLL 清单,而是需要一个应用程序清单吗? - StayOnTarget
1个回答

2

经过@SimonMourier和@HansPassant的指引和更多研究,我终于让这个工作起来了。

我以为如果我使用资源ID#2,就可以使用dll清单,正如@HansPassant所提到的那样,但是我无法通过那种方式使其工作。无论我做什么,dll清单似乎都没有被读取。

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

因此,非常感谢@SimonMourier和@HansPassant,你们两位的评论都让我找到了正确的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接