本人认为用C#调用VC DLL是很有用的知识点,我自己感觉很好用啊,不知道别人用我这个方法是否好用。
VC:
比如想要用C#调用的VC的函数是:
A( int* b ),
因为指针在C#里不容易接,所以这时候我就会在VC里稍微改变一下,
定义一个结构体:
C{ int num; int* b },
之后把那个调用的函数改为:
A( C &c )。
C#:
首先呢,需要引入结构体:
- [StructLayout(LayoutKind.Sequential)]
- public struct C
- {
- public int num;
- public IntPtr b; //注意,这里用的是IntPtr
- }
然后,引入接口函数:
- [DllImport("DLL_NAME.dll")]
- extern static void A(out C c); //这里的out也可以用ref
然后,调用:
- C c = new C();
- A(out c);
最后我们需要把输出的这个c转化为一个int类型的数组,这样才好用:
- int v = c.num
- int[] x=new int[v];
- int size = System.Runtime.InteropServices.Marshal.SizeOf(new int()); //这里是为了算清楚int类型步长
- for (int i = 0; i < v_points_out.points_num; i++)
- {
- int p = (int)System.Runtime.InteropServices.Marshal.PtrToStructure(new IntPtr(c.b.ToInt32() + size * i), typeof(int)); //取出每个值
- x[i] = p;
- }
我写得是简单的例子,专门传整数类型的指针的,
其实还可以是复杂类型的,可是是C#没有的,可以是自己定义的,等等,
写出来C#调用VC DLL这个方法,希望对一些人有帮助。