如何在Delphi中创建的Win32 DLL文件中使用C#函数。当函数参数是自定义delphi对象?
Delphi中的函数定义:
function GetAttrbControls( Code : PChar;
InputList: TItemList;
var Values : TValArray): Boolean; stdcall; export;
使用的类型:
type
TItem = packed record
Code : PChar;
ItemValue: Variant;
end;
TItemList = array of TItem;
TValArray = array of PChar;
C#中的示例(不起作用):
[StructLayout(LayoutKind.Sequential)]
public class Input
{
public string Code;
public object ItemValue;
};
[DllImport("Filename.dll", EntryPoint = "GetValues", CharSet = CharSet.Ansi, ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
public static extern bool GetValues(string Code, Input[] InputList, ref StringBuilder[] Values);
答案 0 :(得分:1)
这不可能以你的方式完成,你仍然有一些可能性。
动态array
(声明w / o []),string
(AnsiString)和Variant
是指向“魔术”结构的指针(它们具有引用计数和负偏移的其他数据) ),由编译器内在处理。
如果你真的想要使用这些类型,你需要在界面周围进行序列化和具体化(使用一些二进制转储格式,JSON等)。
您可以尝试使用任何基本类型(例如array[]
,ShortString
,record
),它们将完全按预期工作(谨防基于ShortString 1的索引)使用StructLayout
将长度存储为0),除非您将它们与托管类型混合。
我也有一些使用接口(IInterface
/ IDispatch
通过COM
InterOp)直接传递Delphi和C#代码之间的对象引用的经验。
当然,你只能调用接口的方法,但是互操作层可以处理至少WideString
(很好)和一些种{{1 (丑)为你。