2017-07-21 24 views
2

我有以下情况:错误COR_E_NEWER_RUNTIME创建并排组装从侧COM类时

  • 原生的Delphi应用程序需要调用从C#DLL COM接口
  • 我想要做合作的应用和DLL不注册的C#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. 

使用TLIBIMP.exe工具从DLL生成了导入的'TestSideBySide2_TLB.pas'

这里的应用程序清单将被链接到Delphi应用程序的资源:

<?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#"; 
     } 
    } 
} 

和大会清单(也与作为进入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应用程序可以解析绑定并将加载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,并且对于它们中的每一个,它都能正常工作。


当然,我一直在研究可能是什么问题,这里是我的发现至今有希望解决这个问题(但没有):

我目前的想法w ^别人可以做到。我在互联网上找到的任何其他资源都只是指向上面列出的其中一项建议。

我还能在那里看到什么?


更新:

一位同事提到它可能是一个Delphi奇怪,并从非托管代码调用。

我们使用英巴卡迪诺西雅图德尔福10

+1

这[简要MSDN博客文章(https://blogs.msdn.microsoft.com/dsnotes/tag/cor_e_newer_runtime/)谈到了'COR_E_NEWER_RUNTIME'错误。 – Ron

+1

@Ron这里(不太简短)和有趣的信息在这里:http://blogs.msdn.com/b/junfeng/archive/2006/05/17/registration-free-com-net-interop.aspx THX! ;-) – user0042

+0

@Ron再次感谢。你给我的链接最终使我找到了正确的解决方案。 – user0042

回答

1

我解决了信息帮助这里的问题发现:

Runtime Versions and Errors 0x80131700 and 0x8013101b

我已经做了尝试添加.NET CLR版本在DLL的程序集清单上。这可以在clrClass部分的每个班级完成。 我不知道的是,runtimeVersion属性必须完全合格。

clrClass部分现在看起来是这样的:

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

根据上述对CLR版本版本条目链接应该是文件:

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