不能返回具有非托管导出的自定义类型实例(Robert Giesecke)

本文关键字:实例 类型 自定义 Robert Giesecke 返回 不能 | 更新日期: 2023-09-27 17:50:52

我正在使用RobertGiesecke的Unmanaged Exports Nuget包来导出. net dll函数,以便在delphi5 win32应用程序中调用它。当传递和返回标准类型(string, int…)时,一切都工作得很好。但是我尝试遵循Marshalling Sample (https://sites.google.com/site/robertgiesecke/Home/uploads#TOC-Marshalling-sample)来返回c#中定义的自定义类型的实例,但我无法正确访问delphi中的实例。

在Delphi中,我的代码是:
type
  TCreateSampleInstance = procedure(var sample: PSample); stdcall;
  TSample = record
    Name: WideString;
  end;
  PSample = ^TSample;
var
  sample: PSample;
  dllHandle: Cardinal;
  proc4: TCreateSampleInstance;
begin
  dllHandle := LoadLibrary('myDotNetAssembly.dll');
  if dllHandle <> 0 then
  try
    @proc4 := GetProcAddress(dllHandle, PChar('CreateSampleInstance'));
    if Assigned(proc4) then
    begin
      proc4(sample);
      // how to access sample properties ?
      Caption := sample^.Name; // Name = '' here instead of 'Test'...
    end;
  finally
    FreeLibrary(dllHandle);
  end;
end;

提前感谢您的帮助!

不能返回具有非托管导出的自定义类型实例(Robert Giesecke)

您可能已经获得了额外的间接层。你的Delphi代码封送了一个指向记录指针的指针。我期望c#代码封送一个指向记录的指针。我希望这一点,尤其是因为在c#中,将指针封送到指向记录的指针需要相当多的努力。

我猜c#代码是这样的:

public static void CreateSampleInstance(out Sample sample)

在这种情况下,你需要这样写:

c#

public struct Sample
{
    [MarshalAs(UnmanagedType.BStr)]
    string Name;
}
[DllExport]
public static void CreateSampleInstance(out Sample sample)
{
    sample.Name = "boo yah";
}
德尔福

type
  TSample = record
    Name: WideString;
  end;
procedure CreateSampleInstance(out sample: TSample); stdcall; 
  external 'myDotNetAssembly.dll';

在Delphi端,为了简单起见,我使用了加载时链接。如果需要,您可以很容易地适应运行时链接。