C# can';t返回具有非托管导出的自定义类型实例(Robert Giesecke)

C# can';t返回具有非托管导出的自定义类型实例(Robert Giesecke),c#,delphi,pinvoke,C#,Delphi,Pinvoke,我使用RobertGiesecke的非托管导出Nuget包导出.NET dll函数,以便在delphi5 win32应用程序中调用它。 当传递和返回标准类型(string、int…)时,一切都能正常工作。 但是我尝试按照编组示例()返回C#中定义的自定义类型的实例,但是我没有在delphi中正确访问该实例 在Delphi中,我的代码是: type TCreateSampleInstance = procedure(var sample: PSample); stdcall; TSamp

我使用RobertGiesecke的非托管导出Nuget包导出.NET dll函数,以便在delphi5 win32应用程序中调用它。 当传递和返回标准类型(string、int…)时,一切都能正常工作。 但是我尝试按照编组示例()返回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;
类型
TCreateSampleInstance=procedure(var-sample:PSample);stdcall;
TSample=记录
名称:WideString;
结束;
PSample=^TSample;
变量
样本:样本;
德尔汉德尔:红衣主教;
proc4:TCreateSampleInstance;
开始
dllHandle:=LoadLibrary('myDotNetAssembly.dll');
如果dllHandle为0,则
尝试
@proc4:=GetProcAddress(dllHandle,PChar('CreateSampleInstance');
如果已分配(proc4),则
开始
proc4(样本);
//如何访问示例属性?
标题:=示例^.Name;//此处的名称=“”而不是“测试”。。。
结束;
最后
免费图书馆;
结束;
结束;

提前感谢您的帮助

你可能有一个额外的间接层。您拥有的Delphi代码封送指向记录指针的指针。我希望C代码封送一个指向记录的指针。我希望这样做,不仅仅是因为在C#中封送指向记录的指针需要相当多的努力

我猜C代码是这样的:

public static void CreateSampleInstance(out Sample sample)
在这种情况下,您需要这样写:

public static void CreateSampleInstance(out Sample sample)
C#

Delphi

type
  TSample = record
    Name: WideString;
  end;

procedure CreateSampleInstance(out sample: TSample); stdcall; 
  external 'myDotNetAssembly.dll';

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

您可能有一个额外的间接层。您拥有的Delphi代码封送指向记录指针的指针。我希望C代码封送一个指向记录的指针。我希望这样做,不仅仅是因为在C#中封送指向记录的指针需要相当多的努力

我猜C代码是这样的:

public static void CreateSampleInstance(out Sample sample)
在这种情况下,您需要这样写:

public static void CreateSampleInstance(out Sample sample)
C#

Delphi

type
  TSample = record
    Name: WideString;
  end;

procedure CreateSampleInstance(out sample: TSample); stdcall; 
  external 'myDotNetAssembly.dll';

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

您可能有一个额外的间接层。您拥有的Delphi代码封送指向记录指针的指针。我希望C代码封送一个指向记录的指针。我希望这样做,不仅仅是因为在C#中封送指向记录的指针需要相当多的努力

我猜C代码是这样的:

public static void CreateSampleInstance(out Sample sample)
在这种情况下,您需要这样写:

public static void CreateSampleInstance(out Sample sample)
C#

Delphi

type
  TSample = record
    Name: WideString;
  end;

procedure CreateSampleInstance(out sample: TSample); stdcall; 
  external 'myDotNetAssembly.dll';

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

您可能有一个额外的间接层。您拥有的Delphi代码封送指向记录指针的指针。我希望C代码封送一个指向记录的指针。我希望这样做,不仅仅是因为在C#中封送指向记录的指针需要相当多的努力

我猜C代码是这样的:

public static void CreateSampleInstance(out Sample sample)
在这种情况下,您需要这样写:

public static void CreateSampleInstance(out Sample sample)
C#

Delphi

type
  TSample = record
    Name: WideString;
  end;

procedure CreateSampleInstance(out sample: TSample); stdcall; 
  external 'myDotNetAssembly.dll';


在Delphi方面,为了简单起见,我使用加载时间链接编写了它。如果需要,您可以随时调整运行时链接。

FWIW,在互操作问题中,您应该始终显示互操作边界的两侧FWIW,在互操作问题中,您应该始终显示互操作边界的两侧FWIW,在互操作问题中,您应该始终显示互操作边界的两侧FWIW,在互操作问题中,您应该始终显示互操作边界的两侧谢谢,如果我使用.NET struct作为参数/返回,它会起作用。是否有传递.NET自定义类实例的解决方案?我使用的是在中提供的示例,您知道如何返回样本数组吗?很好。如果这回答了你的问题,你可能会考虑接受它。无法传递.net类实例,因为只能在.net代码中使用它们。您可以传递COM兼容的接口。我确实知道如何处理数组,但这应该是一个新问题。谢谢你的建议。请看我的新问题:谢谢,如果我使用.NET struct作为参数/返回,它会起作用。是否有传递.NET自定义类实例的解决方案?我使用的是在中提供的示例,您知道如何返回样本数组吗?很好。如果这回答了你的问题,你可能会考虑接受它。无法传递.net类实例,因为只能在.net代码中使用它们。您可以传递COM兼容的接口。我确实知道如何处理数组,但这应该是一个新问题。谢谢你的建议。请看我的新问题:谢谢,如果我使用.NET struct作为参数/返回,它会起作用。是否有传递.NET自定义类实例的解决方案?我使用的是在中提供的示例,您知道如何返回样本数组吗?很好。如果这回答了你的问题,你可能会考虑接受它。无法传递.net类实例,因为只能在.net代码中使用它们。您可以传递COM兼容的接口。我确实知道如何处理数组,但这应该是一个新问题。谢谢你的建议。请看我的新问题:谢谢,如果我使用.NET struct作为参数/返回,它会起作用。是否有传递.NET自定义类实例的解决方案?我使用的是在中提供的示例,您知道如何返回样本数组吗?很好。如果这回答了你的问题,你可能会考虑接受它。无法传递.net类实例,因为只能在.net代码中使用它们。您可以传递COM兼容的接口。我知道如何处理数组,b