我有一个第三方 DLL 用 Delphi“a.dll”(无源代码)编写。
这个 DLL 有一个带有这个签名的方法。
function GetAny(pFileName: String): String;
我无法从 c# 进行互操作调用,因为“字符串类型”在 delphi 中具有私有访问权限。
因此,在 delphi 中构建另一个 DLL 来包装该调用。
德尔福。
function GetAny(pFileName: String): String; external 'a.dll'
function GetWrapper(url : PChar) : PChar; stdcall;
begin
Result := PChar(GetAny(url)); // I need avoid this String allocation, is throwing a exception.
end;
C#。
[DllImport("wrapper.dll", CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Ansi)]
public static extern IntPtr GetWrapper(String url);
在“GetWrapper”中,我调用了外部“GetAny”,结果是好的(在delphi中我可以调试),但是在我把这个结果返回到c#端之前,它抛出了一个异常。
IntPtr test = GetWrapper("a");
String result = Marshal.PtrToStringAnsi(test);