Delphi 从并排程序集创建COM类时出错
我有以下情况:Delphi 从并排程序集创建COM类时出错,delphi,c#-4.0,dll,sharpdevelop,side-by-side,Delphi,C# 4.0,Dll,Sharpdevelop,Side By Side,我有以下情况: 本机Delphi应用程序应该从C#DLL调用COM接口 我想在不注册C#DLL(并排)的情况下配合应用程序和DLL Delphi应用程序代码(控制台可执行文件): program TestSideBySide2; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, mscorlib_TLB in 'mscorlib_TLB.pas', TestSideBySide2_TLB in 'TestSideBySi
- 本机Delphi应用程序应该从C#DLL调用COM接口
- 我想在不注册C#DLL(并排)的情况下配合应用程序和DLL
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应用程序的应用程序清单:
<?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>
异常失败
EOleSysError: OLE-Error 8013101B, ClassID: {A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}
错误代码解析为COR\u E\u NEWER\u运行时
我检查了生成DLL的.NET运行时版本,即.NET 4.0(在我的Windows 10环境中可用) 然后,我尝试为较旧的运行时版本(2.0、3.0、3.5)构建DLL,对于每一个版本,它都工作得很好
当然,我一直在研究什么可能是问题,以下是我迄今为止发现的有希望解决问题的方法(但没有):
- (具体使用DLL清单
元素中的clrClass
属性)runtimeVersion=“v1.4”
更新: 一位同事提到,这可能是Delphi的一个奇怪之处,并且是从非托管代码调用的
我们使用的是Embarcadero Seattle Delphi 10。我通过以下信息解决了问题: 我已经尝试在DLL的程序集清单中添加.NET CLR版本。这可以在
clrClass
部分的每个类中完成。
我不知道的是,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
这是关于
COR_E_NEWER_运行时的错误的。@Ron the(不那么简短)和有趣的信息潜伏在这里:THX!;-)@罗恩再次感谢你。你给我的链接最终让我找到了正确的解决方案。
sideBySide := TestSideBySide2_TLB.CoSideBySideClass.Create();
EOleSysError: OLE-Error 8013101B, ClassID: {A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}
<clrClass
clsid="{A0BDB20B-A6E4-4A36-A64C-CC9186DD1C3E}"
progid="TestSideBySide2"
threadingModel="Both"
name="TestSideBySide2.SideBySideClass"
runtimeVersion="v4.0.30319">
</clrClass>