1. C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题。
  2. C++生成的DLL一般只提供函数接口,不能直接用C#调用C++写的类,这样非常不方便,于是经过半天的反复测试,终于确定了一套可行的方案,下面就是整个流程的一个范例。
  3.  
  4. ()编写C++类Mask,类前面的extern "C" class _declspec(dllexport)这么一串修饰符是必备的,不然无法导出类。
  5. [cpp] view plain copy print?
  6. //Mask类头文件mask.h
  7. #pragma once
  8.  
  9. extern "C" class _declspec(dllexport) Mask
  10. {
  11. public:
  12. Mask(char* inputFile,int* maskValue,int maskLength);
  13. virtual void Run(void);
  14. ~Mask(void);
  15.  
  16. private:
  17. char* _inputFile;
  18. int* _maskValue;
  19. int _maskLength;
  20. };
  21.  
  22. ()Mask类内部实现,这里使用char*和int*这两个有代表性的参数,C#向C++进行参数的传递是很难弄的一步。
  23. [cpp] view plain copy print?
  24. //Mask类实现文件mask.cpp
  25. Mask::Mask(char* inputFile ,int* maskValue,int maskLength)
  26. {
  27. _inputFile=new char[strlen(inputFile)+];
  28. strcpy(_inputFile,inputFile);
  29.  
  30. _maskValue=new int[maskLength];
  31. _maskLength=maskLength;
  32. for(int i=;i<maskLength;i++)
  33. _maskValue[i]=maskValue[i];
  34. }
  35.  
  36. void Mask::Run(void)
  37. {
  38. }
  39.  
  40. Mask::~Mask(void)
  41. {
  42. if (_inputFile)
  43. {
  44. delete [] _inputFile;
  45. _inputFile=NULL;
  46. }
  47. if (_maskValue)
  48. {
  49. delete [] _maskValue;
  50. _maskValue=NULL;
  51. }
  52. }
  53.  
  54. 可以设置生成类型为DLL,然后将debug目录下的dll文件和lib文件找到,留待下一步使用。
  55.  
  56. ()编写C++.NETMaskCLRC++.NET我一直认为就是个摆设,没想到也能派上用场,难得啊,也不完全是个废物。MaskCLR可以调用Mask类,注意函数的参数已经变成String ^和int*,现在是.NET环境,使用指针没那么方便了。
  57. [cpp] view plain copy print?
  58. //MaskCLR类头文件,用来包装Mask类MaskCLR.h
  59. #pragma once
  60. #include " mask.h" //这个就是上面的Mask头文件
  61.  
  62. public ref class MaskCLR
  63. {
  64. private:
  65. char* _inputFile;
  66. int* _maskValue;
  67. int _maskLength;
  68.  
  69. public:
  70. MaskCLR(String ^ inputFile,int* maskValue,int maskLength);
  71. virtual void Run(void) override;
  72. };
  73.  
  74. ()MaskCLR类内部实现,首先要处理参数类型问题,将String ^类型转为char*。在MaskCLR:: Run函数内部调用Mask类,MaskDLL导出的类。
  75. [cpp] view plain copy print?
  76. // MaskCLR类内部实现MaskCLR.cpp
  77. #include "MaskCLR.h"
  78.  
  79. MaskCLR::MaskCLR(String ^ inputFile,int* maskValue,int maskLength)
  80. {
  81. _inputFile=GlobeFunction::StringToChar(inputFile);
  82. _maskValue=maskValue;
  83. _maskLength=maskLength;
  84. }
  85.  
  86. void MaskCLR:: Run(void)
  87. {
  88. Mask mask(_inputFile, _maskValue,_maskLength);
  89. mask.Run();
  90. }
  91.  
  92. ()将String ^类型转为char*,可以利用StringToHGlobalAnsi这个.NET自带的函数。
  93. [csharp] view plain copy print?
  94. char* GlobeFunction::StringToChar(String ^str)
  95. {
  96. return (char*)(Marshal::StringToHGlobalAnsi(str)).ToPointer();
  97. }
  98.  
  99. ()最终生成了两个DLL文件,一个是原始C++编写的,另一个是托管C++编写的,托管dll只是个外壳,最终还是调用原始dll,因此这两个dll要放在一起。下面终于进入C#环境了,首先将托管dll添加引用到C#工程中,C++.NET和C#可以直接互用。
  100.  
  101. ()由于有个int*类型参数,在C#里指针属于不安全代码,因此使用unsafe关键字将涉及到指针的代码包括起来,在工程属性里设置允许使用不安全代码。定义int指针需要使用stackalloc关键字,创建一个int数组,对数组赋值后,将指针传递给类函数。
  102. [csharp] view plain copy print?
  103. //c#调用托管dll中的MaskCLR类form1.cs
  104. unsafe
  105. {
  106. int* value = stackalloc int[];
  107. value[] = ;
  108. MaskCLR mask = new MaskCLR("D:\\临时\\mask8.tif", value, );
  109. mask.Run();
  110. }
  111.  
  112. ()至此大功告成,可以用C#很方便的调用C++写的类了.

C#调用C++ DLL类方法的更多相关文章

  1. C#调用C++ DLL类方法(转)

    http://hi.baidu.com/game_dev/item/ba29ecf67bd5f6cf521c26fc

  2. c# 调用c++DLL方法及注意事项

    引用命名空间 using System.Runtime.InteropServices 调用方法: 一.静态加载 用DllImprot方式来加载c++DLL.如下格式: //对应c++方法 //voi ...

  3. 在.net中调用Delphi dll的Pchar转换

    Pchar是非托管代码,要在.net中调用Delphi dll中的功能,请使用MarshalAs属性告知.net调用PInvoke去转换.net中标准的string类型.如果Delphi dll是De ...

  4. Java调用第三方dll文件的使用方法 System.load()或System.loadLibrary()

    Java调用第三方dll文件的使用方法 public class OtherAdapter { static { //System.loadLibrary("Connector") ...

  5. paip.java 调用c++ dll so总结

    paip.java 调用c++ dll so总结 ///////JNA (这个ms sun 的) 我目前正做着一个相关的项目,说白了JNA就是JNI的替代品,以前用JNI需要编译一层中间库,现在JNA ...

  6. C#调用C++ DLL 文件

    说来惭愧,都注册一年多了,却没有发表过一篇正式的博文,中间很多学习的过程也没有记录下来.如今到了一个新的环境,也有了学习的机会,一定要把每天的收获记录一下. 要做的东西需要引用C++编写的DLL,刚开 ...

  7. LR调用动态链接库DLL

    什么是动态库? 动态库一般又叫动态链接库(DLL),是Dynamic Link Library 的缩写形式,DLL是一个包含可由多个程序同时使用的代码和数据的库. 动态链接提供了一种方法 ,使进程可以 ...

  8. C#调用C++ Dll

    现在项目基本都是旁边C++的哥们做好dll扔给我,然后我调用.好久之前晚上down了一份c#调用c++dll的方法,出处早已经遗忘.闲来无事,放上来好了.原作者看到后可以留言,我会把您链接放上的,帮了 ...

  9. 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)

    OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...

随机推荐

  1. Python--关于连接符+

    连接符 + 连接符 + 实则是创建了新的对象并占用新的内存(dict.set不能使用) String 由于Python必须为每一个使用连接符+的字符串分配新的内存,并产生新的字符串.下面两种方式会更有 ...

  2. [maven] 使用Nexus创建maven私有仓库

    1.为什么需要maven私有仓库? 从Maven中央仓库下载所需的jar包,需要外网的支持.如果公司不能上外网的话则不能从中央仓库下载所需jar包,公司网速慢的时候也会影响项目构建的速度.用户可以用n ...

  3. JavaScipt 源码解析 异步

    我们常见的异步操作: 定时器setTimeout postmessage WebWorkor CSS3 动画 XMLHttpRequest HTML5的本地数据 等等- JavaScript要求在与服 ...

  4. loading

    <!doctype html> <html> <head> <title>实惠福利</title> <meta charset=&qu ...

  5. React Native 的高度与宽度设置

    React Native中的尺寸都是无单位的,表示的是与设备像素密度无关的逻辑像素点. import React, { Component } from 'react'; import { AppRe ...

  6. 响应式注意要添加“视口”约束标记---viewport

    视口:我们试图在iPhone中输出屏幕宽度,你会发现屏幕宽度是980,却和PC屏幕差不多大.原因是苹果主导的这些手机厂商,为了使用户获得完整web体验,很多设备都会欺骗浏览器返回一个数值较大的“视口” ...

  7. easyui表单多重验证,动态设置easyui控件

    要实现的功能:在做添加学生信息的时候,利用easyui的验证功能判断 学号是否重复和学号只能为数字 最终效果如下图: 但在做这个的过程中,遇到了一系列的问题: 扩展validatebox的验证方法,最 ...

  8. [转]CSS网页布局:div水平居中的各种方法

    http://jingyan.baidu.com/article/fa4125ac90a2a328ac70929e.html 在Web标准中的页面布局是使用Div配合CSS来实现的.这其中最常用到的就 ...

  9. 常用dos命令 如查询端口号是否被占用

    ①查询端口号是否被占用掉 在windows命令行窗口下执行:运行--cmdC:\>netstat -aon|findstr "8080" TCP 127.0.0.1:80 0 ...

  10. Spring配置中的classpath和classpath*的区别

    初学SSH框架,昨天在配置Spring的时候,提示我找不到Spring.xml文件,后面百度之后把classpath改成classpath* 就好了,下面是了解到的简单区别. classpath:只会 ...