【问题标题】:32 Bit dll in 64 bBit application64 bBit 应用程序中的 32 位 dll
【发布时间】:2021-03-10 18:53:40
【问题描述】:

我需要在 .net 应用程序中运行 vb6 32 位 dll。当我在 X86 中运行应用程序时,它工作正常。但是当我在“任何 Cpu”配置中运行应用程序时,它会出现以下错误:

由于以下错误,检索具有 CLSID {AAA4DA7D-FC03-4BF7-B240-FA6F323D41EE} 的组件的 COM 类工厂失败:800700c1 不是有效的 Win32 应用程序。 (来自 HRESULT 的异常:0x800700C1)。

对于代码行

CommonUniqueObj = New Uniquekey.Class1

如何解决此错误。我想在“任何 cpu”配置中运行 .net 应用程序?

【问题讨论】:

  • 你在问题​​中得到了答案:将目标 CPU 设置为 x86。
  • 您不能混合使用 32 位和 64 位代码。
  • “我想在“任何 cpu”配置中运行 .net 应用程序”。为什么?您认为这样做会取得什么成就?
  • 这能回答你的问题吗? 64 bit C# with a 32 bit VB6 COM object
  • 关于其他问题,请特别注意答案:stackoverflow.com/a/8908105/3195477

标签: vb.net dll vb6


【解决方案1】:

您可以混合使用 32 位和 64 位。通过调用 exe 位无关紧要。与任何进程外调用一样对数据进行编组。

DLL 可以通过设置注册表值在 exe 中运行。

https://docs.microsoft.com/en-us/windows/win32/com/dllsurrogate

PS 使用 exe 时,最好在每次使用前始终 set,以防用户终止了托管 DLL 的 dllhost.exe

【讨论】:

    【解决方案2】:

    AX (COM) DLL 在进程内运行,正如 cmets 所说,您不能直接混合 x86 和 x64 代码。

    一种可能的解决方法是将 VB6 DLL 编译为 AX EXE。 64 位程序可以实例化 AX EXE,并且可以在它们之间编组数据,因为它们在不同的进程中运行。

    【讨论】:

    • 是的,一种选择是将 VB6 编译为 ActiveX EXE。另一种是构建.Net,目标CPU设置为x86
    • 如果组件能够通过将其重新编译为 AxEXE 来正常工作,那么您可以尝试先将其托管在 COM+ 中以达到相同的效果。不过几率不是很高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2011-01-16
    • 1970-01-01
    • 2012-03-06
    • 2013-04-11
    • 2019-03-07
    • 2012-12-16
    相关资源
    最近更新 更多