如何使用自定义对象从Win32 DLL调用C#函数

时间:2010-05-28 12:28:36

标签: c# .net delphi winapi

如何在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);

1 个答案:

答案 0 :(得分:1)

这不可能以你的方式完成,你仍然有一些可能性。

动态array(声明w / o []),string(AnsiString)和Variant是指向“魔术”结构的指针(它们具有引用计数和负偏移的其他数据) ),由编译器内在处理。

如果你真的想要使用这些类型,你需要在界面周围进行序列化和具体化(使用一些二进制转储格式,JSON等)。

您可以尝试使用任何基本类型(例如array[]ShortStringrecord),它们将完全按预期工作(谨防基于ShortString 1的索引)使用StructLayout将长度存储为0),除非您将它们与托管类型混合。

我也有一些使用接口(IInterface / IDispatch通过COM InterOp)直接传递Delphi和C#代码之间的对象引用的经验。 当然,你只能调用接口的方法,但是互操作层可以处理至少WideString(很好)和一些种{{1 (丑)为你。