百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

C#和C++混合编程-C#调用C++托管类

bigegpt 2025-01-08 11:20 6 浏览

由于C#编写的是托管代码,编译生成微软中间语言,而C++代码则编译生成本地机器码(这种C++也有叫做本地C++或者非托管C++,VC6.0就是用于开发非托管C++代码的平台),这两种语言进行混合编程就存在一定困难。比较常用的方法是使用DllImport的方法,这种方法在网上有很多介绍,这里就不详细叙述了。但是用过这种方法的人都知道这种方法对于导出函数还可以但是却没法导出非托管C++类!非常的要命。

然而,除了C#、非托管C++外,C系列中还存在一种语言叫做托管C++,这种语言语法上和非托管C++几乎一样,但是却和C#一样编译成为微软中间语言,这样托管C++就可以和C#良好地通信,即可以在C#中使用托管C++类。另外,托管C++还有两个及其重要的特性就是:可以调用非托管C++的类和函数!托管C++的程序集可以嵌套非托管C++编译的机器码!好强大的混合体。所以我们的技术路径也就明晰了:C#以托管C++为中介调用非托管C++的类和函数。换句话说也就是用托管C++给非托管C++代码做一个外壳包装供C#调用。

环境:VS2017,Win10;

第一步:新建CLR C++类库。将其命名为Test_DLL



第二步:新建非托管方法 FunctionAdd类

FunctionAdd.h:

//这里定义用于导出的C函数

int Add(int a, int b);

FunctionAdd.cpp:

#include "stdafx.h"

#include "FunctionAdd.h"

//这里实现C函数(算术加法)

int Add(int a, int b)

{

return a + b;

}

第三步:新建非托管类Native类

Native.h:

#pragma once

class Native

{

public:

Native(void);

~Native(void);

int menber;//用于导出的成员

int menderFuncSub(int a, int b);//用于导出的成员函数,实现算术减法

};

Native.cpp:

#include "stdafx.h"

#include "Native.h"

Native::Native(void)

{

//构造

menber = 1;

}

Native::~Native(void)

{

}

//这是非托管C++类实现的算术减法

int Native::menderFuncSub(int a, int b)

{

return a - b;

}

第三步 新建托管类clrClass

clrClass.h:

#pragma once

#include "Native.h"

//这是个托管C++类用于对C++本地代码类和函数等进行封装以在C#中使用

public ref class clrClass

//必须声明为public,否则类在程序集中不可见,关键词ref表示类是一个托管类,将编译为中间语言

{

public:

clrClass(void);

int menber;//这个成员访问非托管类CClassNative的公共成员(事实上只需要包装公共成员和公共成员函数,私有的包装没有意义,也包装不了)

int menderFuncSub(int a, int b);//这个成员函数用于包装非托管类CClassNative的公共成员函数

int menberFuncAdd(int a, int b);//这成员函数用于包装C函数 int Add(int a,int b)

private:

Native * native;//建立一个非托管类实例 (在构造函数中实例化,这里可以理解为是为了在clrClass中“继承”CClassNative的公共成员和方法)

};

clrClass.cpp:

#include "stdafx.h"

#include "clrClass.h"

#include "FunctionAdd.h"

using namespace System;

clrClass::clrClass(void)

{

native = new Native();//这里一定注意要创建对象!

menber = native->menber;//这里是简单举例,最好用属性方法来读写CClassNative类的成员,同C#相似,托管C++中有属性函数,用法请自己查

}

//通过调用非托管类CClassNative的减法函数实现算术减法

int clrClass::menderFuncSub(int a, int b)

{

return native->menderFuncSub(a, b);

}

//通过调用C函数实现算术加法

int clrClass::menberFuncAdd(int a, int b)

{

return Add(a, b);

}

这样就实现了clrClass对Native类和C函数int Add(inta,int b)的托管包装。生成的Test_DLL.dll”就可以直接在C#中用了

第四步:新建WinForm程序,然后引用Test_DLL.dll



代码:

public partial class Form1 : Form

{

clrClass clr = null;

public Form1()

{

InitializeComponent();

clr = new clrClass();

}

private void button1_Click(object sender, EventArgs e)

{

int a = Convert.ToInt32(txtA.Text);

int b = Convert.ToInt32(txtB.Text);

//通过托管C++调用C函数int Add(int a,int b)实现的加法

txtC.Text = clr.menderFuncSub(a, b).ToString();

}

private void btnAdd_Click(object sender, EventArgs e)

{

int a = Convert.ToInt32(txtA.Text);

int b = Convert.ToInt32(txtB.Text);

//通过托管C++调用C函数int Add(int a,int b)实现的加法

txtC.Text = clr.menberFuncAdd(a, b).ToString();

}

}

代码连接:https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/12292745

相关推荐

5分钟搭建公网https网页文件服务器,免费权威TLS证书

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习前言本文主要讲解如何快速搭建一个https网页文件服务器,并免费申请权威机构颁发的tls证...

nginx负载均衡配置(nginx负载均衡配置两个程序副本)

Nginx是什么没有听过Nginx?那么一定听过它的“同行”Apache吧!Nginx同Apache一样都是一种WEB服务器。基于REST架构风格,以统一资源描述符(UniformResources...

19《Nginx 入门教程》Nginx综合实践

今天我们将基于Nginx完成两个比较有用的场景,但是用到的Nginx的配置非常简单。内部Yum源搭建内部Pip源搭建1.实验环境ceph1centos7.6内网ip:172.16....

Nginx性能调优与优化指南(nginx优化配置大全)

Nginx性能调优需要结合服务器硬件资源、业务场景和负载特征进行针对性优化。以下是一些关键优化方向和具体配置示例:一、Nginx配置优化1.进程与连接数优化nginxworker_process...

C++后端开发必须彻底搞懂Nginx,从原理到实战(高级篇)

本文为Nginx实操高级篇。通过配置Nginx配置文件,实现正向代理、反向代理、负载均衡、Nginx缓存、动静分离和高可用Nginx6种功能,并对Nginx的原理作进一步的解析。当需...

【Nginx】史上最全的Nginx配置详解

Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,http块又包括http全局块和server块。Nginx是非常重要的负载均衡中间件,被广泛应用于大型...

【Nginx】Nginx 4种常见配置实例(nginx基本配置与参数说明)

本文主要介绍nginx4种常见的配置实例。Nginx实现反向代理;Nginx实现负载均衡;Nginx实现动静分离;Nginx实现高可用集群;Nginx4种常见配置实例如下:一、Nginx反向代理配...

使用nginx+allure管理自动化测试报告

allure在自动化测试中经常用来生成漂亮的报告,但是网上及官网上给出的例子都仅仅是针对单个测试用例文件的形式介绍的,实际使用中,自动化测试往往需要包含不止一个产品或项目,本文介绍如何使用nginx+...

nginx配置文件详解(nginx配置文件详解高清版)

Nginx是一个强大的免费开源的HTTP服务器和反向代理服务器。在Web开发项目中,nginx常用作为静态文件服务器处理静态文件,并负责将动态请求转发至应用服务器(如Django,Flask,et...

SpringCloud Eureka-服务注册与发现

1.Eureka介绍1.1学习Eureka前的说明目前主流的服务注册&发现的组件是Nacos,但是Eureka作为老牌经典的服务注册&发现技术还是有必要学习一下,原因:(1)一些早期的分布式微服...

微服务 Spring Cloud 实战 Eureka+Gateway+Feign+Hystrix

前言我所在项目组刚接到一个微服务改造需求,技术选型为SpringCloud,具体需求是把部分项目使用SpringCloud技术进行重构。本篇文章中介绍了Eureka、Gateway、Fe...

深度剖析 Spring Cloud Eureka 底层实现原理

你作为一名互联网大厂后端技术开发人员,在构建分布式系统时,是不是常常为服务的注册与发现而头疼?你是否好奇,像SpringCloudEureka这样被广泛使用的组件,它的底层实现原理到底是怎样的...

热爱生活,喜欢折腾。(很热爱生活)

原文是stackoverflow的一则高票回答,原文链接可能之前也有人翻译过,但是刚好自己也有疑惑,所以搬运一下,个人水平有限所以可能翻译存在误差,欢迎指正(如侵删)。尽管classmethod和st...

GDB调试的高级技巧(详细描述gdb调试程序的全过程)

GDB是我们平时调试c/c++程序的利器,查起复杂的bug问题,比打印大法要好得多,但是也不得不说,gdb在默认情况下用起来并不是很好用,最近学习到几个高级点的技巧,分享下:一美化打印先上个例子...

Arduino 实例(二十三)Arduino 给Python 编译器发送信息

1首先Python需要安装Pyserial库,在命令提示符中输入pipintallpyserial若是遇到提示‘pip‘不是内部或外部命令,也不是可运行的程序或批处理文件,则需要设置环境变...