-->

创建可以在Delphi应用程序使用STDCALL要导入的C#DLL - 可能吗?(Create a

2019-06-24 13:14发布

我有一个程序,我需要建立一个DLL,希望能在C#。 该程序是用Delphi编写的,我有一个接口文件的代码。 该接口使用stdcall调用。

是否有可能创建一个符合接口,可在Delphi应用程序中使用C#DLL?

是否有演示如何编写C#的DLL到STDCALL接口方法的一些示例代码?

Answer 1:

这是不可能的纯C#,但是这是一篇文章 ,说明如何在非管理的导出表添加到您的C#库,然后可以在任何其他语言中使用。 请注意,以闪电战的引用成群不应该把你关 - 它们涉及到作者自己的情况下,并没有任何做的基本概念以及它是如何工作的。

还有一个部分布赖恩长的一个会议论文 。 在转弯时,你可以看到的有些讽刺,Delphi.Net居然直接尽管C#不这样做支持非托管的出口。 我不知道如果这是德尔福棱镜也是如此。



Answer 2:

之前,这条路我已经下来了。 我挑选的解决方案是创建一个新的 C#组件(I后来移植这对棱镜),其通过COM暴露互操作我所需的功能以达到。 我被黑拳的API调用转换成简单的东西找到,我就能够减少类的我不得不处理跨互操作障碍的数量。

我没有看水润,但它是大材小用什么,我试图做...这是访问的是.NET程序处理数据呈现第三方SDK。 如果您正在寻找在应用中嵌入的功能(GUI对象,ECT),那么你应该给水润一些考虑。

我没有使用Managed.VCL为系统的一个非常早期的版本,但后来放弃了它的棱镜/ C#COM互操作的做法,是容易部署,更稳定。



Answer 3:

看一看水润



Answer 4:

出于好奇,为什么你一直想写点什么了一种旨在从C#中的本地应用程序使用一个.dll?

托管C ++,Delphi的对于.NET,现在德尔福棱镜都支持这一点,使用非托管出口箱。 在设计上,C#和VB.net没有。 不知道为什么。 但作为Cobus提到的,你可以种破解解决这个问题。 这样做自担风险。

除了从水润的RemObjects,AToZed被引入的CrossTalk 。



Answer 5:

你需要做的组件(= C#DLL),以COM,这就是所谓的Interop访问。

请参阅MSDN文章大会类型库转换和包装的大会COM其中描述的技术背景和实用程序来执行所需的操作。



Answer 6:

我发现了一个由罗伯特·捷后在德尔福棱镜新闻组。 在书中,他宣布一个项目,你可以添加到一个解决方案,让您从.NET的DLL导出任意函数简单地通过增加DllExport属性给他们。 它支持编组一样DllImport 。 他用棱镜项目展示了它,但我想它会在C#类正常工作。 帖子也是在3月,所以我不知道该附件是否仍然可用。 因为它支持自身托管输出棱镜的月发行避免了这样的工具。



Answer 7:

我在这里假设Delphi应用程序不是基于.NET应用程序,因此您需要托管.NET运行库在Win32进程。

  • 托管德尔福计划.NET运行库
  • 达网络互操作-距离Delphi的Win32使用C#组件
  • CorBindToRuntimeEx

CorBindToRuntimeEx是内部MSCorEE.dll中的功能,其保持.NET运行。 有了它,你可以承载运行库,然后创建里面的物体,并与他们进行互动。



Answer 8:

我敢肯定这不能直接完成。 你必须要么用C ++ / CLI的层或露出C#代码作为ActiveX接口。 但是,第二个选项可能不符合你的界面。



Answer 9:

这是不能直接成为可能。 C#的托管代码。 这意味着,它需要一个非常具体的运行环境,以功能,环境,德尔福不能直接提供给它。 它不像C,其中您只需找到的地址和函数的调用约定,并调用它。

然而,也可以举办公共语言运行库Delphi应用程序(或任何其他Windows应用程序)的内部。 我不知道如何做到这一点。 我只知道,这是可能的。 (这是很可能就是这个“九头蛇”,史蒂夫提到的就行了。)



文章来源: Create a C# DLL That Can Be Imported in a Delphi App Using stdcall - Possible?