不能返回具有非托管导出的自定义类型实例(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;
提前感谢您的帮助!
您可能已经获得了额外的间接层。你的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端,为了简单起见,我使用了加载时链接。如果需要,您可以很容易地适应运行时链接。