日期:2014-05-18  浏览次数:20998 次

请教:C#中如何调用C语言编写的形参是二级指针的函数?
大家好,我是写C/C++的,对于C#不是太了解,由于项目急,只看了一天C#方面的资料就开始用C#编程的,现想请教一下大家一个C#方面的问题,谢谢大家的解答。

情况是这样的,我写了一个C的dll动态库,名叫DllRFID.dll,库中封装了一个函数:int API_ISO180006C_CustomCmd(IN HANDLE hSerialComm, IN ISO180006CCMDTYPE cmdType, IN UISO180006CCMDPARAM *puCmdParam, 
OUT SISO180006CCUSTOMCMDRESULT **ppCustomCmdResult);

那我在C#中要如何编写,是不是要写成这样?
  [DllImport("DllRFID.dll", EntryPoint = "API_ISO180006C_CustomCmd", SetLastError = true)]
  public static extern Int32 API_ISO180006C_CustomCmd(IntPtr hSerialComm, Byte cmdType, /* UISO180006CCMDPARAM *puCmdParam */ IntPtr puCmdParam, /*OUT SISO180006CCUSTOMCMDRESULT **ppCustomCmdResult*/ IntPtr ppCustomCmdResult);

还有,调用的代码是怎么写啊?这两天我上网搜到了一些资料,但都没有说到C的二级指针在C#中要怎么写,具体用的时候要怎么调用,哪位高人可以给出一段代码吗?非常感谢!

------解决方案--------------------
不是所有类型都可以跨语言调用的。
------解决方案--------------------
不需要使用指针。在C#中定义好兼容的结构体,用Marshal分配空间,再传递给dll。
------解决方案--------------------
C#的指针自己去MSDN找指针的说明。
------解决方案--------------------
别指望在C#里使用指针了,哪怕是所谓的unsafe状态下指针也是限制极多。

------解决方案--------------------
在C#里不叫指针,而叫引用
用unsafe是可以显示调用指针的,但不建议这么做
------解决方案--------------------
所谓“二级指针”其实就相当于二维数组。
------解决方案--------------------
探讨
所谓“二级指针”其实就相当于二维数组。

------解决方案--------------------
既然熟悉C++,先了解一下PInvoke的基本知识,再用C#写PInvoke调用

C# code

TStudent p = null;
fun1(out p);

------解决方案--------------------
探讨
个人建议是加一层C++/CLI的封装,方便快捷.

------解决方案--------------------
探讨

引用:
个人建议是加一层C++/CLI的封装,方便快捷.

学习难度C++/CLI>C++>C#,最重要的是,C++/CLI编程没有智能语法提示,编译器(最新的11除外)不支持C++/CLI的语法检测。因此用C++/CLI封装还不如用C#直接调用,封装难度比直接调用更大。

------解决方案--------------------
C/C++ code

void fun1(TStudent **pp)
{
  (*p) = malloc(sizeof(TStudent));
  ...
}