2009-01-30 52 views
3

我有一个C语言编写的传统DLL,我想从C#.NET应用程序调用。问题是C DLL的DLL接口相当复杂。这件事情是这样的:从C DLL到.NET的接口

__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中?

感谢, -Greg

回答

3

它很直截了当地使用P/Invoke做这个软的东西在C#。

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

我会建议你看看这个MSDN article关于这个问题

2

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

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

缓存阵列,假设他们定义为字节[]你可以使用以下技术名帅:

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

fixed语句可确保bufffer没有得到在内存由垃圾感动收集器,使指针位于“固定”或“固定”的语句中。

对于多维数组,它依赖于底层的C实现,例如,您可以使用指向数组的指针并根据维数和每个维度中元素的数量调整位置,如下所示:

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

从您的描述看,它已经看起来相当复杂了,你有没有考虑让你的库COM友好?

0

什么药丸。

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

  2. 我会构建第二个本地函数库,其函数设计为P/INVOKED来为第一个函数创建记录并调用它。

或者,您可以使C++本机/托管库来处理编组。

+0

避免COM为什么?互操作性非常好,几乎没有需要做的事情,但导入接口。 – arul 2009-01-30 04:28:56