如何在 Delphi 中调用 .NET Core 6.0 DLL?

How do I call a .NET Core 6.0 DLL in Delphi?

初始情况

我使用了 C组件 Object M模型 (COM)之前的 .NET Framework,以便在 Delphi 中使用我的 C# class 库,如此 YouTube tutorial 中所示,效果出奇地好。但是,我现在想改用 .NET Core 6。

根据微软的官方教程"Expose .NET Core components to COM",我创建了这个界面

using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid(6775d93d-cf14-42b9-83db-425bac0acf4d)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IServer
{
    public string getHelloWorld();
}

还有这个class.

using System.Runtime.InteropServices;

[ComVisible(true)]
[Guid(d62bf794-d29e-4fcd-8637-994490264a93)]
public class Server : IServer
{
    public string getHelloWorld()
    {
        return "Hello World";
    }
}

构建项目后,我执行了此命令以向 COM 注册所有公开的 .NET 对象。

regsvr32 MyProjectName.comhost.dll

命令执行成功。我现在尝试在 Delphi 中导入创建的 .dll 文件,就像我之前使用 .NET Framework 编写的 class 库所做的那样(参见 timestamp of YouTube tutorial)。但是,Delphi 遇到错误,因为它无法加载类型库。


编辑 1:哥斯拉类型的重大改变

根据 official documentation...

Unlike in .NET Framework, there is no support in .NET Core or .NET 5+ for generating a COM Type Library (TLB) from a .NET assembly. The guidance is to either manually write an IDL file or a C/C++ header for the native declarations of the COM interfaces. If you decide to write an IDL file, you can compile it with the Visual C++ SDK's MIDL compiler to produce a TLB.

....NET Core 不支持生成类型库。


编辑 2:MIDL 编译器

但是,仍然有一种方法可以使用 MIDL 编译器手动生成 TBL 文件。您可以在 official documentation, the MIDL compiler processes an IDL file to generate a type library. With that beeing said, I created this IDL file by using this guide.

中阅读
[
    uuid(a93d03e0-9adf-4a2d-93e3-0ccfc2d8e1a6),
    lcid(0x0409),
    version(1.0),
]
library MyProjectName
{
    importlib("stdole.tlb"); 
    [
        uuid(16292ce5-ccd1-405d-9a70-ace42152bb15),
        oleautomation,
        dual
    ]
    interface IServer: IUnknown {
        HRESULT getHelloWorld([out, string] IServer** string);
    };
};

但是,当我执行以下命令生成.tlb文件时出现错误。

midl myProjectName.idl /tlb myProjectName.tlb

> midl : command line error MIDL1005 : cannot find C preprocessor cl.exe

问题: 我在我的电脑上搜索了 cl.exe 但找不到任何东西。

问: 有没有人知道如何解决我的问题?我非常感谢任何形式的帮助,干杯!

如果您不介意切换到不同的方法,您可以使用 NativeAOT 从 .Net 编译本机库。你可以找到一个例子 here

It seems to be planned to be available in .Net 7 但您已经可以开始在 .Net 6 中使用它了。

使用 MVC 创建 API 并从 Delphi 应用程序调用它不是更容易吗?这样你就可以避免 DLL 的所有问题。

也许这个工具可以帮到你:
https://github.com/dspace-group/dscom

 C:\> dotnet tool install dscom -g

 C:\> dscom tlbexport myassembly.dll