【问题标题】:How do I use DLLImport with structs as parameters in C#?如何在 C# 中将 DLLImport 与结构一起用作参数?
【发布时间】:2009-03-23 18:47:01
【问题描述】:

我可以找到使用 DLLImport 从 C# 调用 C++ 代码的所有示例来回传递整数。我可以让这些例子工作得很好。我需要调用的方法将两个结构体作为其导入参数,我不太清楚如何使其工作。

这是我必须处理的:

我拥有 C++ 代码,因此我可以对其进行任何我需要的更改/添加。

第三方应用程序将在启动时加载我的 DLL,并期望 DLLExport 以某种方式定义,因此我无法真正更改导出的方法签名。

我正在构建的 C# 应用程序将用作包装器,因此我可以将此 C++ 部分集成到我们的其他一些应用程序中,这些应用程序都是用 C# 编写的。

我需要调用的 C++ 方法签名是这样的

DllExport int Calculate (const MathInputStuctType *input, 
    MathOutputStructType *output, void **formulaStorage)

而MathInputStructType定义如下

typedef struct MathInputStuctTypeS {
    int             _setData;
    double              _data[(int) FieldSize];
    int             _setTdData;
} MathInputStuctType;

【问题讨论】:

    标签: c# c++


    【解决方案1】:

    MSDN 主题Passing Structures 很好地介绍了将结构传递给非托管代码。您还需要查看Marshaling Data with Platform InvokeMarshaling Arrays of Types

    【讨论】:

    • 非常感谢。这给了我足够的理解来让代码正常工作。
    【解决方案2】:

    根据您发布的声明,您的 C# 代码将如下所示:

    [DllImport("mydll.dll")]
    static extern int Calculate(ref MathInputStructType input,
        ref MathOutputStructType output, ref IntPtr formulaStorage);
    

    根据 C++ 中 MathInputStructType 和 MathOutputStructType 的结构,您还必须对这些结构声明进行属性化,以便它们正确编组。

    【讨论】:

    • 缺少函数名顺便说一句:)
    • “您还必须为这些结构声明赋予属性,以便它们正确编组。”对,这是我不太明白的部分。我将结构添加到我的问题中。
    【解决方案3】:

    对于结构:

    struct MathInputStuctType 
    {
        int       _setData;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = FieldSize)]
        double[]  _data;
        int       _setTdData;
    }
    

    【讨论】:

    • 我不确定它是否是 100% 必要的,但您应该将 _data 字段的 ArraySubType 设置为 UnmanagedType.R8。
    • 应该可以推断出来(我认为,作为编组器非常好)。
    【解决方案4】:

    您可能想在 CodePlex 上查看此项目,http://www.codeplex.com/clrinterop/Release/ProjectReleases.aspx?ReleaseId=14120。它应该可以帮助您正确编组结构。

    【讨论】:

    • 这看起来很酷,但无论我选择什么 DLL,它总是告诉我需要一个清单。如果它有效的话,它看起来像一个很酷的工具。
    • 不知道有这么严格,抱歉。
    • 您可以使用 SigImp Translate Snippet 选项卡查看如何在 C# 中定义特定 C++ 代码,而不是尝试打开 DLL。
    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2020-02-19
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多