如何在 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
初始情况
我使用了 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