C#调用托管C++类(DLL)
毕设是做一个网络摄像头的相关应用。界面用WPF,图像处理部分是OpenCV。没用EmguCV的原因是国内EmguCV的资料相对比较少,EmguCV虽然提供了Winform的控件,在做UI上有一定优势,但Winform的控件弄到WPF里面好像还是要折腾。嫌麻烦,画面部分干脆就用OpenCV自带的namedWindow和imshow函数。摄像头控制部分的UI用WPF写,还有一些边边角角的东西也就用C#写在MainWindow.xaml.cs里面好了。
那么问题就来了,WPF代码是C#的,但OpenCV部分的代码是C++。我想在C#中调用C++写的类,怎么才好呢?上网搜了一下,看到了几篇优秀的文章:
1.
沐枫小筑:您也使用托管C++吗?
这一篇讲的相当到位,文中提到的5个场景基本把每个点都讲到了。其中场景三:现有C++原代码,包装后供C#调用。基本上已经解决了我遇到的问题,但有些细节还不够,我会在后文扩充。
2。
寒星轩:在C#中使用C++编写的类
这一篇完全就是在讲如何包装C++源码,如何调用托管C++类。相当于上一篇中场景三的实例。
3。
MSDN:平台调用教程(C#)
讲DllImport用法的。第一篇的场景一说的就是这个。好像没办法调用类,只能调用方法。而且要要调用的方法多了之后,代码就显得有点难看。优点是简单快捷。
整理扩充
C++头文件
//C++: nativeDog.h
#include <windows.h>
#include <vcclr.h>
#include <string>
#include <iostream>
using namespace std;
class NativeDog
{
public:
NativeDog();
void Bark();
void Speak(LPCWSTR word);
LPCWSTR A(); //用来举例的无意义方法。
private:
//LPCWSTR Unicode字符串指针,它与C#中的string相对应
LPCWSTR name;
}
C++源文件
//C++ : nativeDog.cpp
NativeDog::NativeDog()
{
cout << "WOW!" << endl;
name = L"Doge";
}
void NativeDog::Bark()
{
cout << "WOW WOW WOW I Like BARKING!" << endl;
}
void NativeDog::Speak(LPCWSTR word)
{
wcout << word << endl;
cout << "I said nothing WOW!" << endl;
}
LPCWSTR A()
{
return L"TEST";
}
C++包装类(关键)
// manage.cpp
#include "nativeDog.h"
using namespace System;
namespace myNamespace
{
public ref class Dog
{
private:
NativeDog * m_Impl;
public:
//下面两个方法分别是托管类的构造和析构方法
Dog() :m_Impl(new NativeDog){}
~Dog()
{
delete m_Impl;
}
//开始对NativeDog类中的Bark方法进行包装,包装后的方法名可以不用Bark,参数传递到位就行
void Bark()
{
m_Impl->Bark();
//因为是void型的方法,所以无需return了。
}
void Speak(String ^ word)
{
pin_ptr<const wchar_t> str = PtrToStringChars(word);
m_Impl->Yell(str);
}
String ^A()
{
return gcnew String(m_Impl->A());
}
}
}
编译的时候记得输出为.dll。
然后勾选Common Language Runtime Support里面的/clr。
属性的包装方法就不写了,第二篇资料里有…比较难处理的是字符串的传参。
最后测试一下:
C#调用
// wraptest.cs
using System;
using myNamespace;
namespace myCsharpTest
{
class Programm
static void Main(string[] args)
{
Dog doge = new Dog();
doge.Bark();
doge.Speak("blablabla");
Console.WriteLine(doge.A);
Console.ReadLine();
}
}
记得要添加对nativeDog.dll的引用。
版权声明:本文为博主原创文章,未经博主允许不得转载。
C#调用托管C++类(DLL)的更多相关文章
- C#调用托管ocx、dll
前篇文章是调用非托管,比较复杂,这里是调用托管,很简单[所以在遇到非托管dll时可以通过二次封装成托管的方式,再通过这边文章来使用] 1.注意这是基于COM的ocx或者dll,所以用regsvr32先 ...
- (转)C#调用非托管Win 32 DLL
转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...
- C#如何调用非托管的C++Dll
现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...
- VS建立可供外部调用的MFC类DLL,C#调用MFC调用
建立MFC DLL工程.一般选共享MFC库 关键是在你生成的CPP中,添加外部调用的接口 如下,意思是将这个函数对外公开. 如果你希望对外提供类,就把这个方法做成工厂. 如果你希望对外提供MFC的窗体 ...
- C++如何调用C#开发的dll
序言 本文介绍一个C++如何调用C#开发的dll实例. 前言 C++编写的程序为非托管代码,C#编写的程序为托管代码.托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是 ...
- C#动态调用C++编写的DLL函数
C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...
- 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】
C#中dll调用方法 一. DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一, ...
- c++ c# java 调用 c++ 写的dll
1. vs 中新建win32 dll 项目 testdll 添加实现文件 test.cpp #include "stdafx.h" #include <ios ...
- 调用c++接口类
调用c++接口类 public class CarDeviceDll { /*对dll库进行一些初始化*/ [DllImport("IDI.dll")] public static ...
随机推荐
- MacOSX高分屏图片打包工具tiffutil的简单使用
You can use the man command tiffutil with the option -cathidpicheck. The command lets you manipulate ...
- Trade-----HDU3401----单调队列优化的DP
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3401 题目意思: 有T天,你每天可以以API买进,BPI卖出,最多买ASI个,最多卖BSI个 最多只能 ...
- easyui 个人使用心得之下拉列表
下拉框: 第一种:从数据库获取<input id="FlowType" name="FlowType" style="width: 245px; ...
- java如何避免死锁
在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 加锁时限 死锁检测 加锁顺序 当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生. 如果能确保所有的线程都 ...
- javascript代码实现简单的五星评价功能!
<script type="text/javascript"> //★ var spans=document.getElementsByTagName("sp ...
- Kafka consumer处理大消息数据问题
案例分析 处理kafka consumer的程序的时候,发现如下错误: ERROR [2016-07-22 07:16:02,466] com.flow.kafka.consumer.main.Kaf ...
- 蓝桥杯 C语言 入门训练 Fibonacci数列
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n ...
- putty连接远程局域网的MySql(不需要单独打开plink)
3316 是本地端口,映射到远程内网的一台MySql主机 10.8.2.172
- Redis客户端API操作 Jedis详解
redis是一个著名的key-value存储系统,也是nosql中的最常见的一种.其实,个人认为,redis最强大的地方不在于其存储,而在于其强大的缓存作用. 我们可以把它想象成一个巨大的(多借点集群 ...
- Maven之(四)Maven命令
常用命令 从某种意义上来说,软件是帮助不懂程序的人来操作计算机的,图形化界面尤其如此.在上个世纪,比尔盖茨之所以成为世界首富,微软之所以IT界的巨鳄,就是因为Windows开图形化操作之先河,并抢先占 ...