c# 调用 c dll 例子
1 // case 1 传递 int* ///////////////////////////////////////////// 2 extern “C” __declspec(dllexport) int mySum(int *a2,int *b2) 3 { 4 // 改变 a1, b1 5 *a2=... 6 *b2=... 7 return a+b; 8 } 9 public static extern int mySum (ref int a1,ref int b1); // c# 声明 10 ///////////////////////////////////////////////////////////////////// 11 12 // case 2 DLL 传入 char* 打印 ///////////////////////////////////////////// 13 extern “C” __declspec(dllexport) void print(const char *str) 14 { 15 printf(str); 16 } 17 public static extern void print(string str); // c# 声明 18 ///////////////////////////////////////////////////////////////////// 19 20 // case 3 传入 char* 写回 /////////////////////////////////////////// 21 void foo(char* bar) { 22 // do write some information into char* bar 23 } 24 25 [DllImport("foobar.dll")] 26 private static external void foo(StringBuilder bar); 27 28 public String ReadFoo() { 29 StringBuilder result = new StringBuilder(256); 30 foo(result); 31 return result.ToString(); 32 } 33 // 一些字符的处理 34 public String ReadFoo2() { 35 StringBuilder strBuilder = new StringBuilder(256); 36 foo(strBuilder); 37 Byte[] buf = Encoding.Unicode.GetBytes(strBuilder.ToString()); 38 String result = Encoding.ASCII.GetString(buf); 39 } 40 ///////////////////////////////////////////////////////////////////// 41 42 // case 4 输入数组 //////////////////////////////////////////////// 43 [DllImport("foobar.dll")] 44 private unsafe static extern void getpicture(byte* imageBuffer); 45 46 private byte[] GetImage() { 47 // size of the picture is 1024 * 1024 at RGB color, 8 bit each color 48 Byte[] rc = new Byte[1024 * 1024 * 3]; 49 50 // this block contains unsafe code!!! 51 unsafe { 52 // create the pointer by disabling garbage collection and 53 // memory reallocation 54 fixed (byte* rcPrt = rc) { 55 this.getpicture(rcPtr); 56 } 57 // devalidate pointer and reenable memory reallocation and 58 // garbage collection 59 } 60 // and get safe again 61 62 return rc; 63 } 64 /////////////////////////////////////////////////////////////////
参考:https://www.gadgetweb.de/programming/38-cs-and-the-char-mess.html
注意:结构体中不可以存在方法或者构造函数等其他一切,也就是说只包含成员变量。因为c++的struct如果包含了这些的话,组织结构就会发生异变,与c不同。而c#只单纯处理c的struct!
本文作者:endlesstravel
本文链接:https://www.cnblogs.com/night-ride-depart/p/6719691.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步