Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C#代码调用delphi DLL方法_C#_.net_Delphi_Dll - Fatal编程技术网

从C#代码调用delphi DLL方法

从C#代码调用delphi DLL方法,c#,.net,delphi,dll,C#,.net,Delphi,Dll,我试图从C#ASP.NET代码中调用Delphi函数。函数的声明如下所示: function SomeFunction(const someString, SomeOtherString: string): OleVariant; 根据我的C#代码,我有以下代码: [DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)] public static extern

我试图从C#ASP.NET代码中调用Delphi函数。函数的声明如下所示:

function SomeFunction(const someString, SomeOtherString: string): OleVariant;
根据我的C#代码,我有以下代码:

[DLLImport(MyDLL.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern object SomeFunction(string someString, string SomeOtherString);
每次调用此方法并将其存储为对象时,都会出现p/Invoke错误。我以前从未从我的C#调用过非托管代码,所以我有点不知所措。

试试看

[DLLImport(MyDLL.dll, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr SomeFunction(string someString, string SomeOtherString);
并使用带有返回值的
Marshal.GetObjectForNativeVariant
获取.NET对象。

您不能调用该DLL函数,因为它使用特定于Delphi的
字符串
数据类型,在非Embarcadero产品中没有等效数据类型。(即使您的C#代码可以匹配Delphi字符串类型的结构,您也需要使用DLL的内存管理器分配内存,它几乎肯定不会导出内存。)

如果您能够更改DLL,则使参数的类型为PAnsiChar或PWideChar。(从你的C#声明来看,看起来你想要PAnsiChar。)这就是DLL应该一直使用的


如果不能更改DLL,那么在Delphi或C++ Builder中使用PassiCar或PbCuChar编写一个包装DLL,然后将这些参数转发给原始Delphi DLL。或者大声向DLL供应商投诉,请求使用对其他语言更友好的类型的新版本。

您收到的p/Invoke错误是什么?=)您至少需要将函数标记为“导出”和“stdcall”。显示定义要导出此函数的单位代码。