在VS2010上使用C#调用非托管C++生成opencv代码的DLL文件

C++生成dll并调用(OpenCV) 1.C++OpenCV下载 opencv下载地址: opencv 2.配置系统环境 1.用户变量Path中添加opencv的bin路径 2.新建用户变量OPENCV,添加opencv\build路径 3.转移至opencv\build\x64\vc15\bin,复制opencv_world340.dll和opencv_world340d.dll文件,粘贴至C:\Windows\SysWOW64文件夹和C:\Windows\System32文件夹下 复制opencv_ffmpeg340_64.dll文件粘 阅读详情

背景 

     在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。

 

步骤

1. 创建一个CSharpInvokeCPP的解决方案:

image

 

2. 创建一个C++的动态库项目:

image

 

3. 在应用程序设置中,选择“DLL”,其他按照默认选项:

image

最后点击完成,得到如图所示项目:

image

      我们可以看到这里有一些文件,其中dllmain.cpp作为定义DLL应用程序的入口点,它的作用跟exe文件有个main或者WinMain入口函数是一样的,它就是作为DLL的一个入口函数,实际上它是个可选的文件。它是在静态链接时或动态链接时调用LoadLibrary和FreeLibrary时都会被调用。详细内容可以参考(http://blog.youkuaiyun.com/benkaoya/archive/2008/06/02/2504781.aspx)。

然后在项目属性->VC++目录选项中添加opencv相关的包含文件和库文件。

 

4. 现在我们打开CSharpInvokeCPP.CPPDemo.cpp文件:

现在我们加入以下内容:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"

  extern "C" __declspec(dllexport) void Show()  

 {  
  IplImage *img = cvLoadImage("1.jpg");
     cvNamedWindow("Image:",1);
     cvShowImage("Image:",img);

     cvWaitKey();
     cvDestroyWindow("Image:");
     cvReleaseImage(&img);
     return ;

 }

     extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的;其次,被它修饰的目标是“C”的。而被extern "C"修饰的变量和函数是按照C语言方式编译和连接的。

      __declspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。

      extern "C" __declspec(dllexport)加起来的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做成的DLL。

 

5. 编译项目程序,最后在Debug目录生成CSharpInvokeCPP.CPPDemo.dll和CSharpInvokeCPP.CPPDemo.lib

image

 

6. 现在来演示下如何利用C#项目来调用非托管C++的DLL,首先创建C#控制台应用程序(注意这里最好选择.NET Fframework 3.5):

image

 

7. 在CSharpInvokeCSharp.CSharpDemo项目上新建一个CPPDLL类,编写以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace dllConsoleApplication1
{
    class CPPDLL
    {
        [DllImport("dllTest.dll", CharSet = CharSet.Ansi)]

        public static extern int Show(); 
    }
}

 

DllImport作为C#中对C++的DLL类的导入入口特征,并通过static extern对extern “C”进行对应。

 

8. 另外,记得把CPPDemo中生成的DLL文件拷贝到CSharpDemo的bin目录下

9. 然后在Main入口编写测试代码:

        static void Main(string[] args)
        {
           CPPDLL.Show();

           Console.ReadLine(); 


        }

运行之前记得把一张名字为“1.jpg”的图片放到debug目录下,运行就可以看到这张图片了。

 

10. 以上的方法只能通过静态方法对于C++中的函数进行调用。那么怎样通过静态方法去调用C++中一个类对象中的方法呢?现在我在CPPDemo项目中添加一个头文件userinfo.h:

 
01class UserInfo {
02private:
03    char* m_Name;
04    int m_Age;
05public:
06    UserInfo(char* name, int age) 
07    { 
08        m_Name = name; 
09        m_Age = age;
10    }
11    virtual ~UserInfo(){ }
12    int GetAge() { return m_Age; }
13    char* GetName() { return m_Name; }
14};

 

在CSharpInvokeCPP.CPPDemo.cpp中,添加一些代码:

 
01#include "malloc.h"
02#include "userinfo.h"
03  
04typedef struct {
05    char name[32];
06    int age;
07} User;  
08  
09UserInfo* userInfo;
10  
11extern "C" __declspec(dllexport) User* Create(char* name, int age)    
12{   
13    User* user = (User*)malloc(sizeof(User));
14  
15    userInfo = new UserInfo(name, age);
16    strcpy(user->name, userInfo->GetName());  
17    user->age = userInfo->GetAge();
18  
19    return user; 
20}

这里声明一个结构,包括name和age,这个结构是用于和C#方面的结构作个映射。

注意:代码中的User*是个指针,返回也是一个对象指针,这样做为了防止方法作用域结束后的局部变量的释放。

strcpy是个复制char数组的函数。

 

11. 在CSharpDemo项目中CPPDLL类中补充代码:

 

 
01[DllImport("CSharpInvokeCPP.CPPDemo.dll")]
02public static extern IntPtr Create(string name, int age);
03  
04[StructLayout(LayoutKind.Sequential)]
05public struct User
06{
07    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
08    public string Name;
09  
10    public int Age;
11}

 

其中这里的结构User就和C++中的User对应。

 

12. 在Program.cs中补充代码:

 

 
1IntPtr ptr = CPPDLL.Create("李平", 27);
2<STRONG><FONT color=#ff0000>CPPDLL.User user = (CPPDLL.User)Marshal.PtrToStructure(ptr, typeof(CPPDLL.User));</FONT></STRONG>
3Console.WriteLine("Name: {0}, Age: {1}", user.Name, user.Age);

 

注意:红色字体部分,这里结构指针首先转换成IntPtr句柄,然后通过Marshal.PtrToStructrue转换成你所需要的结构。

 

运行结果:

Windows Mobile开发中的Native C++与.NET Compact Framework技术选型实战 在嵌入式移动开发中,Native C++与.NET Compact Framework代表了底层控制力与开发效率的两种典型范式。其核心差异源于操作系统抽象层级:Native C++直面CE内核、内存映射与硬件中断,提供确定性实时响应;而.NET CF通过托管运行时封装资源管理,在受限内存(如128MB RAM)和低功耗CPU下以可预测的GC行为换取快速交付。这种‘抽象税’的量化权衡——包括启动延迟、内存碎片、P/Invoke开销及跨层互操作风险——构成了IoT边缘设备、车载系统乃至现代轻量级框架选型的关键决 阅读详情

相关推荐

将Halcon导出的C++程序封装为DLL库

然后,在Visual Studio中的项目属性设置中,添加Halcon的头文件目录到附加包含目录中,并将Halcon的库文件目录添加到附加库目录中。有时候,我们可能需要将Halcon中的算法封装成一个动态链接库(DLL),以供其他语言使用或进行代码的隐藏。通过上述步骤,你就可以将Halcon导出的C++程序打包成一个DLL库,供其他项目使用。这些代码可以是从一个现有的Halcon程序中提取出来的,或者是新编写的。本文将介绍如何将Halcon导出的C++程序打包成DLL库,并给出相应的源代码和描述。

2301_79366106的博客 1528

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

背景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用。本篇文章将引导你快速理解这个调用的过程。   步骤 1. 创建一个CSharpInvokeCPP的解决方案:   2. 创建一个C++的动态库项目:   3. 在应用程序设置中,选择“DLL”,其...

weixin_34259232的博客 378

OpenCvSharp跨语言图像处理基础设施实战

图像处理是计算机视觉落地的核心环节,其本质是内存安全、跨平台兼容与实时性三者的工程平衡。OpenCV作为工业级图像处理基石,.NET生态需通过OpenCvSharp实现高效绑定,但原生封装常因托管/非托管内存管理失配、线程上下文撕裂及平台API割裂导致产线级不稳定。本文聚焦SafeMat内存安全封装、IImageProcessor统一接口设计与UWP摄像头低延迟采集等关键技术,揭示如何在VB.NET/C#/UWP/.NET Core多环境共存场景下构建可7×24小时运行的图像处理中间件,并提供基于真实产线验

weixin_29895109的博客 230

C#调用C++图像处理算法(opencv)

C#调用C++图像处理算法(OpenCV) 因为需要做一个图像处理的程序,后来决定采用C#写界面,C++写算法调用opencv的函数。关于opencv的使用之前已经学习过了,需要实现的是在C#中如何使用C++语言编写的DLL。 参考: 优快云支持语法高亮的常用语言 本开发环境为win10+vs2010 C++编程笔记:dll的生成与使用 参考:C++编程笔记:...

Wagsn 3800

海康SDK+Qt+Halcon封装.zip

海康SDK+Qt+Halcon封装

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1751

C#调用C++的dll两种方法(托管与非托管)

C#调用C++的方式分为两种:(1)非托管的方式进行调用;(2)采用托管的方式进行调用。 一、使用非托管类调用C++的dll。 1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include  #include  extern "C" _ _declspec(dllexport) void Sho

liyuqian199695的博客 5万+

深入浅出ISP:用RKISP2.x Tuner工具理解AWB、AE、HDR等核心模块的实战调参

本文深入解析RKISP2.x Tuner工具在ISP图像处理中的实战应用,重点探讨AWB、AE、HDR等核心模块的调参技巧。通过环境搭建、调试工具使用和实际案例,帮助开发者掌握如何在不同光照条件下优化图像质量,实现精准的白平衡、曝光控制和动态范围处理。

weixin_26802933的博客 487

C#调用C++ dll 总结 内含(opencv)

一直都想搞搞C#调用C++DLL,一直没有时间或搞的shihou

wazwx的专栏 5254

解码运动想象:BCI Competition IV 2a数据集实战指南

本文提供了BCI Competition IV 2a数据集的实战指南,详细解析了该经典运动想象脑电数据集的结构、文件格式与实验范式。通过MNE-Python等工具,逐步演示了从原始信号读取、预处理(通道选择、滤波、分段)到特征提取(CSP、频带功率)和模型训练(LDA、SVM)的完整流程,并强调了受试者独立评估的重要性,为BCI研究者提供了可复现的入门与进阶路径。

weixin_29304985的博客 362

人工智能100问☞第5问:什么是AI三要素?

人工智能的核心三要素是​​数据、算法和算力​​,分别作为AI的“燃料”、“大脑”和“动力”,三者协同驱动智能系统的学习、推理与决策能力。

bjdx_001的博客 1991

在C#调用C++的DLL (1)非托管的方式进行调用;(2)采用托管的方式进行调用。

C#调用C++的方式分为两种: 一、使用非托管类调用C++的dll。 1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include &lt;cv.h&gt; #include &lt;highgui.h&gt; extern "C" _ _declspec(dllexport)void Show(...

好大一只鸡的专栏 503

物联网应用开发教程专栏介绍与说明——列表目录查阅(持续更新)

为方便查阅学习本专栏,特整理专栏介绍与说明及提供列表目录便于查阅。阿齐Archie《物联网应用开发教程》专栏。本专栏为物联网应用开发教程,将更新涵盖常见的WIFI、蓝牙、蜂窝网、以太网、Lora、NB-iot等物联网技术实战应用及详解其技术知识。专栏为技术文章,订阅一个文章即可本专栏内所有文章可看,实战开发,亲测无误,附视频演示效果,会持续更新本专栏。本专栏内有理论篇也有完整实战应用篇。

嵌入式阿齐Archie 2万+

C# 调用 C++ DLL(3) 非托管方式:直接调用C++方法(使用范例)

1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其中代码: #include &lt;cv.h&gt; #include &lt;highgui.h&gt; extern "C" _ _declspec(dllexport)void Show()   {   IplImage *img = cvLoadImage(...

好大一只鸡的专栏 981

华为云物联网系统开发(纯云端)外包方案及项目需求说明书

提供一个详细的需求文档(SRS,Software Requirements Specification),用于指导完全零基础的非专业负责人外包兼职专业技术人员开发一款基于华为云物联网平台、Astro低代码平台和Astro Canvas大屏设计的物联网系统,纯软件实现并支持下载部署。文档涵盖详细的软硬件组成清单(聚焦软件和云服务)、技术文档要求等,确保非专业人员在移交后能够复用、扩展和操作该系统。本文档简洁、全面,适合非技术背景的管理者使用,并基于华为云生态的内部实施部署。

hy行者勇哥的博客 620

【Windows Server 2019】存储服务器的配置和管理——iSCSI的安装和配置(下)

博文介绍了如何使用Windows 10 和 ESXi 验证iSCSI服务器部署成功以及如何管理iSCSI服务 。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 8000

转载:C#调用c++的dll

C#调用C++的dll两种方法(托管与非托管) C#调用C++的dll两种方法(托管与非托管) C#调用C++的方式分为两种:(1)非托管的方式进行调用;(2)采用托管的方式进行调用。 一、使用非托管类调用C++的dll。 1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示   2、添加MyDLL.cpp源文件,其

enjoy.day 413

SAP GUI 字段遮罩功能详解及实现

默认情况下,系统使用作为掩码模式,遮罩整个字段内容长度;对于货币金额类型,掩码后会保留小数位并在整数位部分全部显示为,如****.**若需自定义掩码模式,可利用以下方式:维护“Maintain Masking Pattern”节点,在其中定义新的掩码方式(如:只露出后四位,其他位以X替代等);实现 BAdI(或类似命名,具体以系统版本为准)的方法,通过 ABAP 代码读取原始值,并依据业务逻辑生成掩码字符串返回,动态替换界面输出值;

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 709

开发相关:

1):C#利用Picturebox控件显示图片: https://blog.youkuaiyun.com/liyuqian199695/article/details/54098938/

zhenaoxi1077的博客 295

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C#调用的C++库的使用(三种方式)

功能性Dll应该采用Win32控制台的模板进行修改成Dll创建 推荐文章 窗口类Dll应该采用MFC的Dll模板来创建 1、 直接调用C++类库中的公共方法 使用DllImport特性对方法进行调用,比如一个C++类库SampleCppWrapper.dll中的公共方法: extern “C” __declspec(dllexport) int __stdcall Add(int n1...

Milu_Y 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Halcon与C++图像数据结构转换

参考地址:http://tsindahui.blog.sohu.com/151668003.html 1. 从Halcon到VC++ read_image(&Image,"文件名");//读入的为灰度图像 //获取图像指针,注意输出变量的类型 char lpcsType[MAX_STRING]; Hlong Pointer,Width, Height;...

weixin_30823833的博客 1252

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Cmake编译Opencv+VS2010项目嵌入

利用Cmake编译Opencv3.3.0并将build文件引入vs2010工程,以实现项目可以在无需配置opencv环境的新机器上正常运行。 任务需求: 1.根据所需运行环境重新编译opencv源代码,比如不同操作系统(包括x86x64等)、不同VS版本等需求; 2.实现opencv库的一次性配置,避免重复针对不同环境查找添加运行库DLL和静待库LIB的操作; 3.实现项目迁移之后,不需要...

u013569930的博客 944
上一篇: 深度估计&平面检测小结
下一篇: Bundle Adjustment简述
HFKuAng
博客等级 码龄11年 70粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值