从 Delphi 调用 dotNET 并返回一个字符串

本文关键字:一个 字符串 返回 Delphi 调用 dotNET | 更新日期: 2023-09-27 18:33:53

Delphi应用程序如何调用导出的函数(非COM)dotNET程序集并让该函数返回字符串?

COM 不是我的特定应用程序的可能解决方案。我可以控制通话的两端。

到目前为止我尝试过的东西 - 德尔福客户端

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;

点网 dll 端

public class DotNetDllClass
{
  [DllExport]
  public static string StrProc(ref string s)
  {
      return "Hello from .Net " + s;
  }
}

什么有效

我可以成功地将整数传入和传出 dotNET 过程。我可以成功地将字符串(Delphi 端的宽字符串)传递到 dotNET 过程中。

什么不起作用

在上面的两个列表中,返回的字符串参数是垃圾。访问它会导致 AV。

环境

Delphi XE7,dotNET 4,Win 7,32位应用程序和dll。

从 Delphi 调用 dotNET 并返回一个字符串

匹配 Delphi 的 C# 代码应该是:

[DllExport]
public static void StrProc(
    [MarshalAs(UnmanagedType.BStr)] 
    ref string s
)
{
    s = "Hello from .Net " + s;
}

请注意,返回类型void以匹配您的德尔菲代码。我用UnmanagedType.BStr来匹配WideString.这是封送文本的最简单方法,因为分配是由两个编译器自动执行的。

不要因为尝试将字符串作为封送为BStr的返回值传递而陷入困境。Delphi 不使用与其他编译器相同的 ABI,请参阅为什么 WideString 不能用作互操作的函数返回值?