gpt4 book ai didi

delphi - 从并排程序集创建 COM 类时出现错误 COR_E_NEWER_RUNTIME

转载 作者:行者123 更新时间:2023-12-03 18:40:08 25 4
gpt4 key购买 nike

我有以下情况:

  • native Delphi 应用程序应从 C# DLL
  • 调用 COM 接口(interface)
  • 我想在不注册 C# DLL(并排)的情况下配合应用程序和 DLL

  • Delphi 应用程序代码(控制台可执行文件):
    program TestSideBySide2;

    {$APPTYPE CONSOLE}

    {$R *.res}

    uses
    System.SysUtils,
    mscorlib_TLB in 'mscorlib_TLB.pas',
    TestSideBySide2_TLB in 'TestSideBySide2_TLB.pas';

    var
    sideBySide : TestSideBySide2_TLB._SideBySideClass;
    intfSideBySide : TestSideBySide2_TLB.ISideBySideClass;
    res : HRESULT;

    begin
    try
    sideBySide := TestSideBySide2_TLB.CoSideBySideClass.Create();
    res := sideBySide.QueryInterface(IID_ISideBySideClass,intfSideBySide);

    Writeln(intfSideBySide.Version());

    except
    on E: Exception do
    Writeln(E.ClassName, ': ', E.Message);
    end;
    end.

    进口 'TestSideBySide2_TLB.pas'使用 TLIBIMP.exe 从 DLL 生成工具。

    这是将作为资源链接到 Delphi 应用程序的应用程序 list :
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
    xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
    <assemblyIdentity
    type="win32"
    name="TestSideBySide.exe"
    version = "1.0.0.0" />
    <dependency>
    <dependentAssembly>
    <assemblyIdentity
    type="win32"
    name="TestSideBySide2"
    version="1.0.0.0" />
    </dependentAssembly>
    </dependency>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
    <requestedPrivileges>
    <requestedExecutionLevel
    level="asInvoker"
    uiAccess="false"/>
    </requestedPrivileges>
    </security>
    </trustInfo>
    </assembly>

    C# DLL 代码(使用 SharpDevelop 编译)
    using System;
    using System.Reflection;
    using System.Runtime.InteropServices;

    [assembly: AssemblyVersion("1.0.0.0")]
    [assembly: Guid("07F9C367-BFA4-45AD-8A60-689096BD7AA9")]

    namespace TestSideBySide2
    {

    /// <summary>
    /// Exposed interface.
    /// </summary>
    [Guid("49D49031-12D8-40B5-85FA-B42133FD7DD0")]
    public interface ISideBySideClass
    {
    string Version();
    }

    /// <summary>
    /// Implementation of exposed interface.
    /// </summary>
    [Guid("A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E")]
    public class SideBySideClass : ISideBySideClass
    {
    public string Version()
    {
    return "1.0.0-C#";
    }
    }
    }

    程序集 list (也作为资源链接到 DLL 中):
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1"
    manifestVersion="1.0">
    <assemblyIdentity
    type="win32"
    name="TestSideBySide2"
    version="1.0.0.0" />
    <clrClass
    clsid="{A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}"
    progid="TestSideBySide2"
    threadingModel="Both"
    name="TestSideBySide2.SideBySideClass" >
    </clrClass>
    </assembly>

    到目前为止一切都相当简单。 Delphi 应用程序可以解析绑定(bind)并加载 DLL。但是线
    sideBySide := TestSideBySide2_TLB.CoSideBySideClass.Create();

    异常失败
    EOleSysError: OLE-Error 8013101B, ClassID: {A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}

    错误代码解析为 COR_E_NEWER_RUNTIME .

    我检查了构建 DLL 的 .NET 运行时版本,即 .NET 4.0(在我的 Windows 10 环境中可用)。

    然后我尝试为较旧的运行时版本(2.0、3.0、3.5)构建 DLL,并且每个版本都运行良好。

    当然,我一直在研究可能是什么问题,这是我迄今为止发现的有希望解决问题的方法(但没有):
  • Cannot get to work VB.NET DLL referenced by VB6 client in reg-free scenario
  • How to: Configure .NET Framework-Based COM Components for Registration-Free Activation (使用 DLL list runtimeVersion="v1.4" 元素中的 clrClass 属性)

  • 目前我不知道还能做什么。我在互联网上找到的任何其他资源都只是指向我上面列出的建议之一。

    我还能在那里俯瞰什么?

    更新:

    一位同事提到这可能是 Delphi 的怪事和来自非托管代码的调用。

    我们正在使用 Embarcadero Seattle Delphi 10。

    最佳答案

    我在此处找到的信息的帮助下解决了问题:

    Runtime Versions and Errors 0x80131700 and 0x8013101b

    我已经尝试在 DLL 的程序集 list 中添加 .NET CLR 版本。这可以在 clrClass 中按类(class)完成。部分。
    我不知道的是,runtimeVersion属性必须是完全限定的。

    完整的clrClass部分现在看起来像这样:

    <clrClass
    clsid="{A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}"
    progid="TestSideBySide2"
    threadingModel="Both"
    name="TestSideBySide2.SideBySideClass"
    runtimeVersion="v4.0.30319">
    </clrClass>

    根据上面链接的文档,其他 CLR 版本的版本条目应该是:

    • v1.0.3705
    • v1.1.4322
    • v2.0.50727
    • v4.0.30319

    关于delphi - 从并排程序集创建 COM 类时出现错误 COR_E_NEWER_RUNTIME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45240138/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com