托管C++– OpenCV 图像处理工程项目:
C++ 托管和非托管项目的区别:
C++ 托管项目,采用C++语言编写COM组件,导出函数或类,供CLR(公共语言运行时)C++托管类封装接口。编写的C++ COM组件不需要,公共语言运行时(/clr)支持。编写C++托管类COM组件,需要,公共语言运行时支持。
创建VC++项目,可以在属性配置中->常规:
修改(配置类型)可以选择.exe进行调试。可以选择.dll 生成组件
修改(公共语言运行时支持(/clr)),编写供WPF工程引用的COM组件
注意:带有/clr头的组件可以用ildasm.exe 进行反编译,可以在VS 2013 x86 命令提示符,控制台中,输入ildasm x.dll 反编译组件头的部分,需要双击MANIFEST字段,查看组件依赖的.net版本信息,包含Version, publickeytoken。有可能会在注册全局程序集命令:gacutil 中用到。以上提到的命令可以使用 /? 选项查看详细说明。本文档过程中未用到,但相关错误,查看众多博客有用这两个命令解决。
C++项目导出类声明:class __declspec(dllexport) [class_name]{};
托管C++项目引用类声明:public ref class [class]{};
托管C++项目值类声明:public value class [class]{};
托管C++项目需要申明命名空间名。所有类和函数需要包含到命名空间中。供引用时调用。
关于托管C++:https://msdn.microsoft.com/zh-CN/library/68td296t.aspx
非托管C++项目,采用非托管的C++组件,在WPF项目中引用,方法类似于Android中使用到JNI:Java、C++混合编程。使用C++编写COM组件,导出函数。尝试过导出类,但在引用处无法调用。查看过众多博客,没见使用非托管的方式导出类,有博客提到非托管方式导出类,方式较为繁琐。本处留作以后尝试。
同样创建普通C++ 控制台工程即可。(配置类型)设置为.dll。同样可以设置为.exe进行调试。
在导出函数前添加导出声明:__declspec(dllexport)
非托管C++项目:
WPF项目中的调用:
using System.Runtime.InteropServices; //使用DllImport需要用到的命名空间
public class cppdll
{
[DllImport(@"Base.dll", CharSet =CharSet.Ansi)]
publicstaticexternIntPtr print();
}
可以编写类来封装导出函数。其中IntPtr对应于C++中的char*。
在调试模式下需要将编译好的COM组件放置到bin->Debug目录下。发布程序需要放到Release目录下。
组件申明表达式:
[DllImport(@”dll文件路径”,[EntryPoint = [函数名]], [CharSet = [对应字符集]])]
函数需申明为外部链接静态函数。
托管C++项目:
创建控制台工程(空项目)VideoStreamReader:
VideoReader.h:#ifndef VIDEO_READER_H
#define VIDEO_READER_H
#inc