从 Delphi 和 return 字符串调用 dotNET
Call dotNET from Delphi and return a string
Delphi 应用程序如何调用导出函数(非 COM)dotNET 程序集并使函数 return 成为字符串?
COM 不是我的特定应用程序的可能解决方案。我可以控制通话的两端。
到目前为止我尝试过的 - Delphi 客户端
type
TStrProc = procedure( var x: widestring); stdcall;
function TryIt: string;
var
Handle: THandle;
Proc: TStrProc;
InData: widestring;
OutData: widestring;
begin
Handle := LoadLibrary( 'DelphiToDotNet.dll');
if Handle = 0 then exit;
@Proc := GetProcAddress( Handle, 'StrProc');
if @Proc <> nil then
begin
InData := 'input';
Proc( InData);
OutData := InData;
end;
FreeLibrary( Handle);
result := OutData
end;
dotNET dll 端
public class DotNetDllClass
{
[DllExport]
public static string StrProc(ref string s)
{
return "Hello from .Net " + s;
}
}
什么有效
我可以成功地将整数传入和传出 dotNET 过程。
我可以成功地将字符串(Delphi 端的宽字符串)传递到 dotNET 程序中。
什么不起作用
在上面的两个清单中,字符串参数 returned 是垃圾。访问它会导致 AV。
环境
Delphi XE7、dotNET 4、Win 7、32 位应用程序和 dll。
匹配 Delphi 的 C# 代码应该是:
[DllExport]
public static void StrProc(
[MarshalAs(UnmanagedType.BStr)]
ref string s
)
{
s = "Hello from .Net " + s;
}
请注意,return 类型是 void
以匹配您的 Delphi 代码。我用 UnmanagedType.BStr
来匹配 WideString
。这是编组文本的最简单方法,因为分配是由两个编译器自动为您执行的。
不要因为试图将字符串作为 return 值而被编组为 BStr
。 Delphi 不使用与其他编译器相同的 ABI,请参阅 Why can a WideString not be used as a function return value for interop?
Delphi 应用程序如何调用导出函数(非 COM)dotNET 程序集并使函数 return 成为字符串?
COM 不是我的特定应用程序的可能解决方案。我可以控制通话的两端。
到目前为止我尝试过的 - Delphi 客户端
type
TStrProc = procedure( var x: widestring); stdcall;
function TryIt: string;
var
Handle: THandle;
Proc: TStrProc;
InData: widestring;
OutData: widestring;
begin
Handle := LoadLibrary( 'DelphiToDotNet.dll');
if Handle = 0 then exit;
@Proc := GetProcAddress( Handle, 'StrProc');
if @Proc <> nil then
begin
InData := 'input';
Proc( InData);
OutData := InData;
end;
FreeLibrary( Handle);
result := OutData
end;
dotNET dll 端
public class DotNetDllClass
{
[DllExport]
public static string StrProc(ref string s)
{
return "Hello from .Net " + s;
}
}
什么有效
我可以成功地将整数传入和传出 dotNET 过程。 我可以成功地将字符串(Delphi 端的宽字符串)传递到 dotNET 程序中。
什么不起作用
在上面的两个清单中,字符串参数 returned 是垃圾。访问它会导致 AV。
环境
Delphi XE7、dotNET 4、Win 7、32 位应用程序和 dll。
匹配 Delphi 的 C# 代码应该是:
[DllExport]
public static void StrProc(
[MarshalAs(UnmanagedType.BStr)]
ref string s
)
{
s = "Hello from .Net " + s;
}
请注意,return 类型是 void
以匹配您的 Delphi 代码。我用 UnmanagedType.BStr
来匹配 WideString
。这是编组文本的最简单方法,因为分配是由两个编译器自动为您执行的。
不要因为试图将字符串作为 return 值而被编组为 BStr
。 Delphi 不使用与其他编译器相同的 ABI,请参阅 Why can a WideString not be used as a function return value for interop?