3

我有一个用 C 语言编写的旧版 DLL,我想从 C# .NET 应用程序中调用它。问题是 C DLL 的 DLL 接口相当复杂。是这样的:

__declspec(dllexport) void __stdcall ProcessChunk(
    void *p_prochdl,
    const BIG_INPUT_STRC *p_inparams,
    BIG_OUTPUT_STRC *p_outparams
);

BIG_INPUT_STRC/BIG_OUTPUT_STRC 包含各种各样的东西......指向缓冲区数组的指针、枚举参数、整数参数等。总之,它们很复杂。

第一个问题:有没有一种简单的方法可以将 DLL 头文件中包含的所有结构信息都放入 C# 类中,还是需要将所有内容复制并粘贴到 C# 中并重新定义它?这似乎是多余的。

与此相关,将结构从 C# 传递到非托管 DLL 的正确方法是什么?

最后,是否有一个如何将缓冲区数组从 C# 正确传递到非托管 DLL 的示例?或者,如何将二维数组传递到 DLL 中?

谢谢,-格雷格

4

3 回答 3

3

使用 P/Invoke 在 C# 中做这件事是非常直接的。

我相信您将不得不在 C# 中手动定义数据结构。

我建议您看一下有关该主题的MSDN 文章

于 2009-01-30T03:59:07.917 回答
2

您需要广泛使用.net marshalling。首先,您需要在 C# 代码中重新定义 C 结构,然后确保使用MarshalAs属性正确编组所有内容。

如果需要将 C# 中的指向结构的指针传递回 C 函数,则可以使用Marshal.StructToPtr函数。

缓冲区数组,假设它们被定义为 byte[] 您可以使用以下技术编组:

byte[] buffer = ...;
fixed(byte *pBuffer = buffer)
{
   // do something with the pBuffer
}

固定语句确保缓冲区不会被垃圾收集器移动到内存中,从而使语句中的指针“固定”或“固定”。

至于多维数组,它取决于底层的 C 实现,例如,您可以使用指向数组的指针并根据维数和每个维度中的元素数调整位置,例如:

someValue = buffer[(elementsPerDimensions * x) + y];

从你的描述看来已经很复杂了,你考虑过让你的库对 COM 友好吗?

于 2009-01-30T04:10:41.370 回答
0

什么药丸。

  1. 我会避免尝试使库 COM 友好。这比它的价值更麻烦。

  2. 我将构建第二个本机库,其功能设计为 P/INVOKED 以建立第一个记录并调用它。

或者,您可以制作一个 C++ 本机/托管库来处理封送处理。

于 2009-01-30T04:16:32.513 回答