毕设是做一个网络摄像头的相关应用。界面用WPF,图像处理部分是OpenCV。没用EmguCV的原因是国内EmguCV的资料相对比较少,EmguCV虽然提供了Winform的控件,在做UI上有一定优势,但Winform的控件弄到WPF里面好像还是要折腾。嫌麻烦,画面部分干脆就用OpenCV自带的namedWindowimshow函数。摄像头控制部分的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)的更多相关文章

  1. C#调用托管ocx、dll

    前篇文章是调用非托管,比较复杂,这里是调用托管,很简单[所以在遇到非托管dll时可以通过二次封装成托管的方式,再通过这边文章来使用] 1.注意这是基于COM的ocx或者dll,所以用regsvr32先 ...

  2. (转)C#调用非托管Win 32 DLL

    转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...

  3. C#如何调用非托管的C++Dll

    现在在Windows下的应用程序开发,VS.Net占据了绝大多数的份额.因此很多以前搞VC++开发的人都转向用更强大的VS.Net.在这种情况下,有很多开发人员就面临了如何在C#中使用C++开发好的类 ...

  4. VS建立可供外部调用的MFC类DLL,C#调用MFC调用

    建立MFC DLL工程.一般选共享MFC库 关键是在你生成的CPP中,添加外部调用的接口 如下,意思是将这个函数对外公开. 如果你希望对外提供类,就把这个方法做成工厂. 如果你希望对外提供MFC的窗体 ...

  5. C++如何调用C#开发的dll

    序言 本文介绍一个C++如何调用C#开发的dll实例. 前言 C++编写的程序为非托管代码,C#编写的程序为托管代码.托管代码虽然提供了其他开发平台没有的许多优势,但由于前期系统及历史版本很多使用的是 ...

  6. C#动态调用C++编写的DLL函数

    C#动态调用C++编写的DLL函数 动态加载DLL需要使用Windows API函数:LoadLibrary.GetProcAddress以及FreeLibrary.我们可以使用DllImport在C ...

  7. 转【C#调用DLL的几种方法,包括C#调用C\C++\C#DLL】

    C#中dll调用方法   一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一, ...

  8. c++ c# java 调用 c++ 写的dll

    1. vs 中新建win32 dll 项目   testdll 添加实现文件       test.cpp #include "stdafx.h" #include <ios ...

  9. 调用c++接口类

    调用c++接口类 public class CarDeviceDll { /*对dll库进行一些初始化*/ [DllImport("IDI.dll")] public static ...

随机推荐

  1. c/c++性能优化--I/O优化(上)

    这节本想直接介绍I/O优化的,后来思考一下有必要对常用的I/O操作函数的特点介绍一下,这样要好些.下面就先介绍和I/O有关的库函数(以C99为准) 不同的操作系统有不同的文件管理方式,现行的主要有FA ...

  2. android 组件内部实现触摸事件,更改背景

    当我们需要实现触摸事件的时候,通常就会想到OnTouchEvent这个方法,它能够获取触摸点的坐标,而组件同样也有这样的一个功能,使用这个功能,可以实现组件在父布局界面上移动,缩放,更改背景图片.这里 ...

  3. 通告机制Notification

    Obj-c的基本通讯原则是对象间的消息传递,这种情况多出现在两个对象之间.但是如果多个对象共同关注一个对象状态的时候呢,当然可以让发生事件的对象向所有关注他的对象发送消息,但是这并不高效.所以有了通告 ...

  4. Hybrid App(一)App开发选型

    1.几种app开发模式概述 Native App 即传统的原生APP开发模式,Android基于Java语言,底层调用Google的 API;iOS基于OC或者Swift语言,底层调用App官方提供的 ...

  5. CCNA网络工程师学习进程(7)路由器的路由配置

        前面一节已经介绍了路由器的端口配置,接着我们介绍路由器的路由配置:静态路由.默认路由和浮动路由的配置:动态路由协议的配置,包括RIP.IGRP.EIGRP和OSPF.     (1)路由器的基 ...

  6. WPF星空效果

    效果 前阵子看到ay的蜘蛛网效果和知乎的登录页背景,觉得效果很酷.自己也想写一个.于是写着写着就变成这样了.少女梦幻的赶脚有木有.我这有着一颗少女心的抠脚大汉 实现思路 分为两个部分: 1.星星无休止 ...

  7. 将bat文件或exe程序注册成windows服务

    命令行使用sc命令.关于sc命令的详解,请自行查看帮助(sc /?),在此只简单提及如何加入系统服务功能.加入服务:sc create ServiceName binPath= 路径 start= a ...

  8. [SQL基础教程] 4-1 数据的插入(INSERT)

    [SQL基础教程] C4 数据更新 4-1 数据的插入(INSERT) INSERT INSERT INTO <表名>(列1,列2...) VALUES(值1,值2...); 清单 用() ...

  9. R语言 关联规则

    在用R语言做关联规则分析之前,我们先了解下关联规则的相关定义和解释. 关联规则的用途是从数据背后发现事物之间可能存在的关联或者联系,是无监督的机器学习方法,用于知识发现,而非预测. 关联规则挖掘过程主 ...

  10. C#文件处理

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...