如何将DLLImport与结构一起用作C#中的参数?

时间:2009-03-23 18:47:01

标签: c# c++

我可以使用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;

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:3)

对于struct:

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

答案 3 :(得分:2)

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