我有一个需要创建DLL的程序,希望使用C#完成。该程序是用Delphi编写的,我有一个接口文件可供编码。该接口使用stdcall调用约定。
是否可能创建符合该接口并可以在Delphi应用程序中使用的C# DLL?
是否有一些示例代码可以演示如何将C# DLL编码为stdcall接口方法?
我有一个需要创建DLL的程序,希望使用C#完成。该程序是用Delphi编写的,我有一个接口文件可供编码。该接口使用stdcall调用约定。
是否可能创建符合该接口并可以在Delphi应用程序中使用的C# DLL?
是否有一些示例代码可以演示如何将C# DLL编码为stdcall接口方法?
出于好奇,为什么您希望编写一个旨在从C#本地应用程序中使用的.dll文件?
Managed C++、Delphi for .Net和现在的Delphi Prism都支持使用未管理的导出来完成这一点。设计上,C#和VB.net不支持。不确定为什么。但正如Cobus所提到的,您可以通过某种方式绕过此问题。但这样做存在风险。
除了RemObjects的Hydra外,AToZed还推出了CrossTalk。
我在 Delphi Prism 论坛上发现了一篇来自 Robert Giesecke 的帖子。他在其中宣布了一个项目,可以将任意函数从 .Net DLL 中导出,只需将 DllExport
属性添加到它们中即可。它支持像 DllImport
一样的编组。他用 Prism 项目演示了它,但我想它也适用于 C# 类。这篇文章是在三月份发布的,所以我不确定附件是否仍然可用。Prism 的五月版已经支持自身的非托管导出,因此不再需要这样的工具。
您需要使装配程序(=C# DLL)对COM可访问,这被称为Interop。
请参阅MSDN文章“装配程序到类型库转换”和“为COM打包一个装配程序”,这些文章描述了所需操作的技术背景和实用工具。
CorBindToRuntimeEx是MSCorEE.dll中的一个函数,其中包含.NET运行时。通过它,您可以托管运行时,然后在其中创建对象并与之交互。
这是不可能直接实现的。C#是托管代码。这意味着它需要一个非常特定的运行时环境才能正常工作,而Delphi无法直接为其提供此环境。这与C不同,您不能仅仅找到函数的地址和调用约定然后调用它。
但是,在Delphi应用程序(或任何其他Windows应用程序)中托管公共语言运行时是可能的。我不知道如何做到这一点。我只知道这是可能的。(很可能这就是Steve提到的“Hydra”所要做的事情。)