IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

C#和C++混合编程的一些tips

大树底下 2010-05-25 10:23:11 累计浏览 4,433 次
本机暂存

最近帮朋友写个小东西的时候,刚好用到了C#和C++的混合编程,记录一些tips供日后参考。

首先说明下环境:C#调用C++的库函数,C++建立一个非托管类库项目,C#项目引用之。

1.C++类库中的tips

C++类库中导出函数的声明如下:

extern "C" __declspec(dllexport) int* Detect(char* data,int width,int height);

需要注意的是:

要使用extern "C" 标明,否则C#调用时会找不到方法名;其次要使用__declspec(dllexport)标明为导出函数。

2.C#调用的tips

C#调用时,首先需要声明外部方法的签名,如下:

[DllImport("DetectDll.dll", CallingConvention = CallingConvention.Winapi)]
public extern static void Detect ([MarshalAsUnmanagedType.LPArray,SizeConst=8]byte[] bp,int w,int h,[MarshalAsUnmanagedType.LPArray,SizeConst=4]int[] result);

需要注意的是:

指明CallingConvention为Winapi类型;

对于数组类型需要指明MarshalAs的方式,一般的定长数组或下标有上限的,都可以用LPArray来Marshal。

3.其它

调用非托管代码需要使用unsafe关键字,对于指针需要进行fixed限制。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 如何学好C++语言 (累计阅读 10,445)
  2. Emacs配置C/C++-mode的代码智能提示和自动补全 (累计阅读 10,411)
  3. colortail,让 tail 命令绚丽起来 (累计阅读 10,258)
  4. 在C++中实现foreach循环,比for_each更简洁! (累计阅读 9,497)
  5. 几个内存相关面试题(c/c++) (累计阅读 9,443)
  6. 关于使用STL的红黑树map还是hashmap的问题 (累计阅读 8,873)
  7. 浅析C++多线程内存模型 (累计阅读 8,801)
  8. C++ 多线程编程总结 (累计阅读 8,096)
  9. 使用gdb调试运行时的程序小技巧 (累计阅读 7,205)
  10. 在C++里写一个不能被继承的类 (累计阅读 6,579)