FreePascal 64位DLL并调用C#Application

| 我正在尝试编译用于​​64位C#应用程序的64位dll。我有一个简单的类和一个简单的应用程序来尝试对其进行测试,无论我尝试做什么,它都会失败。这是代码: 德尔斐
library project1;

{$mode objfpc}{$H+}

uses
  Classes;


function Encrypt(aName:PChar):PChar;stdcall;
begin
  Result := aName;
end;


exports Encrypt;

begin
end.
C#
 [DllImport(\"project1.dll\")]
    [return: MarshalAs(UnmanagedType.LPStr)]
    public static extern String Encrypt([MarshalAs(UnmanagedType.LPStr)] String aName);
任何人都可以看到它有什么问题,并且如果不愿意创建相同的简单方案来尝试使其正常工作,我将束手无策了!     
已邀请:
        这样做的问题是C#编组器将一个临时存储块传递给函数passes2ѭ。函数返回时,该内存被销毁。但是,您还要求C#编组将同一块内存编组为C#字符串。 无论如何,从本机DLL函数返回以null终止的字符串都是不好的做法。您有两种选择: 在C#端使用ѭ3来为字符串预分配内存。这要求您以某种方式掌握所需的大小。这是互操作字符串的最常见方法。 将字符串作为COM
BSTR
返回,C#编组人员知道如何编组和处置dis4ѭ,并且可以访问COM分配器。我不知道在FreePascal中使用
BSTR
,但是在Delphi中,您只是使用
WideString
。您还需要告诉C#编组您要返回
BSTR
。 我个人比较喜欢选项2。但是有一个折衷,就是不同的编译器对函数返回值使用不同的ABI,如在此问题上所讨论的:为什么不能将WideString用作互操作的函数返回值?解决此问题的简单方法是在参数中返回字符串,而不是使用函数返回值。 代码如下: 帕斯卡
procedure Encrypt(Input: WideString; out Output: WideString); stdcall;
begin
  Output := Input;
end;
C#
[DllImport(\"project1.dll\")]
public static extern void Encrypt(
    [MarshalAs(UnmanagedType.BStr)] string input;
    [MarshalAs(UnmanagedType.BStr)] out string output
);
    

要回复问题请先登录注册