2010-05-06 71 views
2

这是我的第一篇文章!如何调用以C指针作为参数的C dll中的函数#

我想使用C#将使用预编译C库的Windows窗体程序。它将访问智能卡并提供输出。 对于图书馆,我有一个.dll,.lib和.h,没有来源。在.h文件中定义了几个结构。 .dll最有趣的功能是指向分配结构的指针作为参数。我一直称该.dll里面的功能是这样的:例如函数

EID_API int WINAPI EidStartup(int nApiVersion); 

将被称为像这样

[DllImport("CelikApi.dll")]//the name of the .dll 
public static extern int EidStartup(int nApiVersion); 

现在我的问题是,我无法找到同样的C的指针,其指向在C#中的内存中动态分配的结构,所以我不知道要传递给需要C指针的函数的参数。我没有太多的C#经验,但对我来说,它的使用看起来是制作我需要的程序最简单的方法。我尝试过使用C++,但Visual Studio 2010没有针对C++/CLR的IntelliSense。如果你能指点我更好的东西,随时可以这样做。

回答

1

你可以做这样的事情

[DllImport("Operations.dll")] 
    public static extern void Operation(
     [MarshalAs(UnmanagedType.LPArray)]ushort[] inData, 
     int inSize1, int inSize2, 
     [MarshalAs(UnmanagedType.LPArray)]int[] outCoords, 
     ref int outCoordsSize); 

该代码将一个无符号short(在C#USHORT),以及多种尺寸参数(inSize1和inSize2),以及地方导致的动态分配的数组outCoords大小outCoordsSize的数组。

您的C代码无法分配内存,并期望C#可以很好地处理它; C#应该分配你的C代码使用的所有内存。在上述情况下,您可以将outCoords数组的大小放在outCoordsSize中,然后将outCoordsSize的值替换为您实际使用的内存量(不能超过最初分配的内存量,且无异常)。

相关问题