初始情况
之前,我使用了Component Object Model (COM),以便使用Delphi中的C#类库,如这个YouTube教程中所示,它运行得非常好。但是,我现在想要使用.NET核心6。
按照Microsoft “将.NET核心组件公开给COM”的官方教程,我创建了这个界面。
using System.Runtime.InteropServices;
[ComVisible(true)]
[Guid(6775d93d-cf14-42b9-83db-425bac0acf4d)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IServer
{
public string getHelloWorld();
}还有这门课。
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框架编写的类库一样(参见YouTube教程的时间戳)。但是,Delphi遇到了一个错误,因为它无法加载类型库。
编辑1:哥斯拉-类型的破坏变化
根据正式文件..。
与.NET框架不同,.NET Core或.NET 5+中不支持从.NET程序集生成COM类型库(TLB)。指南是为COM接口的本机声明手动编写IDL文件或C/C++头。如果您决定编写一个IDL文件,您可以使用VisualC++SDK的MIDL编译器编译它以生成一个TLB。
..。在.NET核心中不支持生成类型表。
编辑2: MIDL编译器
但是,仍然有一种使用MIDL编译器手动生成TBL文件的方法。当您可以在正式文件中读取时,MIDL编译器会处理一个IDL文件来生成一个类型库。说到这里,我使用本指南创建了这个IDL文件。
[
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,但什么也找不到。
问:,有人知道我如何解决我的问题吗?我非常感谢任何帮助,干杯!
发布于 2022-03-09 14:17:37
如果您不介意切换到另一种方法,则可以使用.Net使用NativeAOT编译本机库。您可以找到一个示例这里
它似乎计划在.Net 7中提供。,但是您已经可以开始在.Net 6中使用它了。
发布于 2022-03-11 20:11:39
使用MVC创建API并从Delphi应用程序调用它不是更容易吗?这样就可以避免DLL的所有问题。
发布于 2022-03-15 08:26:43
也许这个工具能帮你:
https://github.com/dspace-group/dscom
C:\> dotnet tool install dscom -g
C:\> dscom tlbexport myassembly.dllhttps://stackoverflow.com/questions/71378349
复制相似问题