【问题标题】:Delphi DLL in C# - var array as parameterC# 中的 Delphi DLL - var 数组作为参数
【发布时间】:2011-02-24 13:45:16
【问题描述】:

我需要在我的 C# 代码中使用 Delphi DLL。

我在使用其他具有通用参数的方法时取得了一些成功,但在这种情况下,解决方案仍然隐藏。

DLL 文档提供了以下声明:

Function Get_Matrix (var Matrix : array [ 1..200 ] of char) : boolean ; stdcall;

我尝试使用:

[DllImport("DLL.dll")]
public static extern bool Get_Matrix(ref char[] Matrix);

不成功。一些帮助?

【问题讨论】:

    标签: c# arrays delphi dll


    【解决方案1】:

    您需要做的第一件事是在 C# 端使用stdcall

    [DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
        CharSet=CharSet.Auto)]
    

    我还想确定 Delphi 方面是 Delphi 2009 之后的版本,因此使用宽字符。如果是这样,那么那里没有问题。如果您使用的是非 Unicode Delphi,那么您需要 CharSet.Ansi

    我可能还会在 Delphi 端返回一个 LongBool 并将其编组

    [return: MarshalAs(UnmanagedType.Bool)]
    

    回到 .NET 端。

    最后,固定长度数组需要以不同方式编组。固定长度字符数组的标准方法是在 .NET 端使用 StringBuilder,根据需要进行编组。

    把它放在一起,并修复你的 Delphi 语法,给出:

    德尔福

    type
      TFixedLengthArray = array [1..200] of char;
    
    function Get_Matrix(var Matrix: TFixedLengthArray): LongBool; stdcall;
    

    C#

    [DllImport("DLL.dll", CallingConvention=CallingConvention.StdCall,
        CharSet=CharSet.Auto)]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool Get_Matrix(StringBuilder Matrix);
    
    static void Main(string[] args)
    {
        StringBuilder Matrix = new StringBuilder(200);
        Get_Matrix(Matrix);
    }
    

    最后,确保在从 DLL 中返回字符串时以空值结尾!

    【讨论】:

    • 嗨,问题仍然存在。这似乎与“char数组”有关,当我声明没有参数的导入时程序仍在运行,但是当我声明char参数时
    • 嗨,我之前没想过。我忘记了阵列编组。我相信更新后的答案会为您完成这项工作。
    • @André 太棒了!谢谢你让我知道。
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多