Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从并排程序集创建COM类时出错_Delphi_C# 4.0_Dll_Sharpdevelop_Side By Side - Fatal编程技术网

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
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应用程序的应用程序清单:

<?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>