我有以下情况:错误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,并且对于它们中的每一个,它都能正常工作。
当然,我一直在研究可能是什么问题,这里是我的发现至今有希望解决这个问题(但没有):
- 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清单
clrClass
元素runtimeVersion="v1.4"
属性明确)
我目前的想法w ^别人可以做到。我在互联网上找到的任何其他资源都只是指向上面列出的其中一项建议。
我还能在那里看到什么?
更新:
一位同事提到它可能是一个Delphi奇怪,并从非托管代码调用。
我们使用英巴卡迪诺西雅图德尔福10
这[简要MSDN博客文章(https://blogs.msdn.microsoft.com/dsnotes/tag/cor_e_newer_runtime/)谈到了'COR_E_NEWER_RUNTIME'错误。 – Ron
@Ron这里(不太简短)和有趣的信息在这里:http://blogs.msdn.com/b/junfeng/archive/2006/05/17/registration-free-com-net-interop.aspx THX! ;-) – user0042
@Ron再次感谢。你给我的链接最终使我找到了正确的解决方案。 – user0042