C++的优势在于高效灵活,C#的优势在于简单易用,两者结合起来对项目开发来说是件好事,而且C++不容易反编译,也保障了代码的安全性,如果一些核心算法使用C#编写,那么保密就是一个问题。
C++生成的DLL一般只提供函数接口,不能直接用C#调用C++写的类,这样非常不方便,于是经过半天的反复测试,终于确定了一套可行的方案,下面就是整个流程的一个范例。 ()编写C++类Mask,类前面的extern "C" class _declspec(dllexport)这么一串修饰符是必备的,不然无法导出类。
[cpp] view plain copy print?
//Mask类头文件mask.h
#pragma once extern "C" class _declspec(dllexport) Mask
{
public:
Mask(char* inputFile,int* maskValue,int maskLength);
virtual void Run(void);
~Mask(void); private:
char* _inputFile;
int* _maskValue;
int _maskLength;
}; ()Mask类内部实现,这里使用char*和int*这两个有代表性的参数,C#向C++进行参数的传递是很难弄的一步。
[cpp] view plain copy print?
//Mask类实现文件mask.cpp
Mask::Mask(char* inputFile ,int* maskValue,int maskLength)
{
_inputFile=new char[strlen(inputFile)+];
strcpy(_inputFile,inputFile); _maskValue=new int[maskLength];
_maskLength=maskLength;
for(int i=;i<maskLength;i++)
_maskValue[i]=maskValue[i];
} void Mask::Run(void)
{
} Mask::~Mask(void)
{
if (_inputFile)
{
delete [] _inputFile;
_inputFile=NULL;
}
if (_maskValue)
{
delete [] _maskValue;
_maskValue=NULL;
}
} 可以设置生成类型为DLL,然后将debug目录下的dll文件和lib文件找到,留待下一步使用。 ()编写C++.NET类MaskCLR,C++.NET我一直认为就是个摆设,没想到也能派上用场,难得啊,也不完全是个废物。MaskCLR可以调用Mask类,注意函数的参数已经变成String ^和int*,现在是.NET环境,使用指针没那么方便了。
[cpp] view plain copy print?
//MaskCLR类头文件,用来包装Mask类MaskCLR.h
#pragma once
#include " mask.h" //这个就是上面的Mask头文件 public ref class MaskCLR
{
private:
char* _inputFile;
int* _maskValue;
int _maskLength; public:
MaskCLR(String ^ inputFile,int* maskValue,int maskLength);
virtual void Run(void) override;
}; ()MaskCLR类内部实现,首先要处理参数类型问题,将String ^类型转为char*。在MaskCLR:: Run函数内部调用Mask类,Mask是DLL导出的类。
[cpp] view plain copy print?
// MaskCLR类内部实现MaskCLR.cpp
#include "MaskCLR.h" MaskCLR::MaskCLR(String ^ inputFile,int* maskValue,int maskLength)
{
_inputFile=GlobeFunction::StringToChar(inputFile);
_maskValue=maskValue;
_maskLength=maskLength;
} void MaskCLR:: Run(void)
{
Mask mask(_inputFile, _maskValue,_maskLength);
mask.Run();
} ()将String ^类型转为char*,可以利用StringToHGlobalAnsi这个.NET自带的函数。
[csharp] view plain copy print?
char* GlobeFunction::StringToChar(String ^str)
{
return (char*)(Marshal::StringToHGlobalAnsi(str)).ToPointer();
} ()最终生成了两个DLL文件,一个是原始C++编写的,另一个是托管C++编写的,托管dll只是个外壳,最终还是调用原始dll,因此这两个dll要放在一起。下面终于进入C#环境了,首先将托管dll添加引用到C#工程中,C++.NET和C#可以直接互用。 ()由于有个int*类型参数,在C#里指针属于不安全代码,因此使用unsafe关键字将涉及到指针的代码包括起来,在工程属性里设置允许使用不安全代码。定义int指针需要使用stackalloc关键字,创建一个int数组,对数组赋值后,将指针传递给类函数。
[csharp] view plain copy print?
//c#调用托管dll中的MaskCLR类form1.cs
unsafe
{
int* value = stackalloc int[];
value[] = ;
MaskCLR mask = new MaskCLR("D:\\临时\\mask8.tif", value, );
mask.Run();
} ()至此大功告成,可以用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. MFC编程入门之七(对话框:为对话框添加控件)

    创建对话框资源需要创建对话框模板.修改对话框属性.为对话框添加各种控件等步骤,前面一讲中已经讲了创建对话框模板和修改对话框属性,本节继续讲如何为对话框添加控件.  上一节中创建了一个名为"A ...

  2. Maven3简介

    Maven3简介 百度百科 maven官网: http:\/\/maven.apache.org\/ Maven下载安装 Maven 下载:http:\/\/maven.apache.org\/dow ...

  3. MVC5 + EF6 入门完整教程一:从0开始

    第0课 从0开始 ASP.NET MVC开发模式和传统的WebForm开发模式相比,增加了很多"约定". 直接讲这些 "约定" 会让人困惑,而且东西太多容易忘记 ...

  4. win server2008R2安装framework1.1后,在应用池中不能编辑选择framework1.1的解决办法

    C:\Users\Administrator>mklink /d "c:/Windows/Microsoft.NET/Framework64/v1.1.4322" " ...

  5. WCF初探-22:WCF中使用Message类(上)

    前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...

  6. jquery mobile 教程

    简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的.可跨设备的Web应用程序.我们将后续的介绍中向大家介绍大量的代码及实例. jQuery一直以来都是非常流行的富客户端及Web应用程 ...

  7. OpenCV源码分析:RGB到其他色彩空间的转换

    1.流程调用图 2.部分代码分析 //模板函数进行颜色空间的转换 template <typename Cvt> void CvtColorLoop(const Mat& src, ...

  8. Leetcode 171 Excel Sheet Column Number 难度:0

    https://leetcode.com/problems/excel-sheet-column-number/ class Solution { public: int titleToNumber( ...

  9. SunSonic 3.0 ORM开源框架的学习

    SubSonic 3.0简介 接触到SubSonic3.0 ORM框架是看了AllEmpty大神的从零开始编写自己的C#框架(链接在此)系列的随笔接触到的,本文章学习内容源于AllEmpty大神. S ...

  10. android属性之excludeFromRecents -- clearTaskOnLaunch 隐身意图 启动activity

    这个可以  用android 任务中app 隐藏起来 android属性之clearTaskOnLaunch 此属性是 每次启动app时都会进入 根目录中      android:clearTask ...