C# 编译程序引用C++DLL托管动态链接库实例

本文主要是介绍C# 编译程序引用C++DLL托管动态链接库实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

构建 C# 程序引用C++DLL托管动态链接库

  • 前言
    • 1、统一框架版本
    • 2、统一编译平台
    • 3、C++ 托管动态链接库的优点
      • 3.1、C++ 托管动态链接库引用方便简单
      • 3.2、C++ 托管动态链接库加快了程序构建和重复利用
      • 3.3、C++ 托管动态链接库源代码更加安全
    • 4、构建与 C# 程序进行互操作的C++.DLL动态链接库的三种方法
      • 4.1、使用DllImport特性构建DLL库
      • 4.2 、使用C++/CLI构建(我称之为:C++DLL托管动态链接库)
      • 4.3 、使用COM组件构建
  • 一、构建 C++ DLL托管动态链接库
    • 1、VS2022创建新项目,
    • 2、选择C++、Windows、库,选择Windows 桌面向导,点下一步,
    • 3、为项目命名,并选择项目目录,开始创建项目,
    • 4、配置新项目中,选择动态链接库,只勾选空项目,点确定,创建项目完成。
    • 5、添加托管类 Coord,勾选托管,
      • 5.1、Coord.h 文件内容:
      • 5.2、Coord.CPP 文件内容:
    • 6、添加空白CoordConvert.CPP 和 CoordConvert.H,
      • 6.1、CoordConvert.H 文件内容
      • 6.2、CoordConvert.CPP 文件内容
    • 7、添加 DLL 资源版本内容,
    • 8、编译属性页,公共语言运行时支持选择 .NET Framework 运行时支持 (/clr),.NET Framework 目标框架版本 V4.0,C++ DLL托管动态链接库和C# 引用 C++ DLL 程序的编译平台统一为 X64 或 X86。(演示为X64)
  • 二、构建 C# 程序,引用 C++ DLL托管动态链接库
    • 1、构建 C# .NET Framework 桌面 Windows 窗体应用
    • 2、命名测试项目 TestCoord,框架版本选择 .NET Framework V4.0,和 C++ DLL托管动态链接库框架版本一致,编译 C# 引用 C++ DLL 程序的编译平台统一为 X64 或 X86。(演示为X64)
    • 3、在项目中添加上面编译的 Coord.DLL 托管动态链接库,
      • 3.1、窗体新建默认按钮 button1,双击 button1 按钮,进入代码编辑,
  • 三、验证 C++ DLL托管动态链接库 和 C# 引用 C++ DLL 的程序
  • 四、完整项目演示代码下载

前言

1、统一框架版本

使用微软编程工具:VS2022,统一采用 .net framework 4.0框架,C++ DLL托管动态链接库和C# 引用 C++ DLL 程序的框架版本必须一致,不统一框架会导致程序无法编译(2个项目在同一个解决方案里时)或无法正常引用DLL库。

2、统一编译平台

C#应用程序与C++ DLL托管动态链接库,统一编译为 X64 或 X86,否则无法正常引用DLL库。

3、C++ 托管动态链接库的优点

3.1、C++ 托管动态链接库引用方便简单

C# 调用C++.DLL动态链接库时,构建与 C# 程序进行互操作的C++.DLL动态链接库有 3 种方法,其中托管动态链接库最方便,在 C# 中直接引用,即可引用C++.DLL的类。

3.2、C++ 托管动态链接库加快了程序构建和重复利用

C++ DLL 托管库,加快了程序构建和重复利用,且运行速度快。
C++库已经存在并且经过了充分测试和验证,需要被C#项目重复使用时。
C++编写的库中包含高性能计算、海量数据处理等需要使用底层语言实现的操作时,可以考虑将这些操作封装为动态链接库供C#调用。
在跨平台开发时,C++可在多个平台上运行,通过封装为dll,可以让C#项目也能够在多个平台上运行。
需要将不同的功能模块拆分成独立的组件,C++编写的dll可以作为一个独立的组件,供C#项目或其他语言的项目调用。
通过调用C++编写的dll可以兼顾高性能和高开发效率。
C++作为一种系统级编程语言,可以访问系统底层资源,如内存、磁盘、网络等,C#调用C++编写的dll可以实现访问这些底层资源的功能,从而提供更多的功能。

3.3、C++ 托管动态链接库源代码更加安全

C++ 托管动态链接库可以保障源代码不容易反编译泄露。程序核心代码使用C++构建,保护了代码的著作权利。界面和简单的代码使用C# 和 VB.NET 构建,因为C# 和 VB.NET 很容易反编译出源代码。

4、构建与 C# 程序进行互操作的C++.DLL动态链接库的三种方法

4.1、使用DllImport特性构建DLL库

在C++中封装为一个dll,并导出函数和过程:
在C#项目中需要使用DllImport特性导入这个dll,并调用其中的函数或过程。

4.2 、使用C++/CLI构建(我称之为:C++DLL托管动态链接库)

C++/CLI是一种结合了C++和CLR(Common Language Runtime)的语言,它可以编写针对.NET Framework/CLR的代码,同时也可以访问C++的底层资源。因此,我们可以使用C++/CLI来封装C++库,并将其作为dll供C#调用。
需要注意的是,当使用C++/CLI封装C++库时,需要确保两者所使用的Runtime是相同的,编译平台也要一致。比如,如果C++库是使用静态连接的方式与CRT(C Runtime)链接的,那么我们需要在C++/CLI项目的属性中设置“/MT”选项,以保证代码使用相同的CRT版本。

4.3 、使用COM组件构建

COM是微软推出的一种二进制接口标准,它可以让不同的应用程序之间以二进制码互相通信。
将Dll封装为一个COM组件。需要创建一个类,其中包含COM接口和类工厂。

一、构建 C++ DLL托管动态链接库

1、VS2022创建新项目,

在这里插入图片描述

2、选择C++、Windows、库,选择Windows 桌面向导,点下一步,

在这里插入图片描述

3、为项目命名,并选择项目目录,开始创建项目,

在这里插入图片描述

4、配置新项目中,选择动态链接库,只勾选空项目,点确定,创建项目完成。

在这里插入图片描述

5、添加托管类 Coord,勾选托管,

在这里插入图片描述

5.1、Coord.h 文件内容:

#pragma once
public ref class Coord
{
public:Coord(void);~Coord(void);void showBox();//C#要调用的托管过程
};

5.2、Coord.CPP 文件内容:

#include "Coord.h"
#include "CoordConvert.h"Coord::Coord(void)
{
}
Coord::~Coord(void)
{
}
void Coord :: showBox()
{show();//C++ 托管类调用 C++过程
}

6、添加空白CoordConvert.CPP 和 CoordConvert.H,

在这里插入图片描述

6.1、CoordConvert.H 文件内容

#pragma once
void show();

6.2、CoordConvert.CPP 文件内容

#include<windows.h>
#include "CoordConvert.h"void show()
{MessageBox(NULL,TEXT("C++动态链接库托管,C#调用成功!"),TEXT("提示"),MB_OK);
}

7、添加 DLL 资源版本内容,

在这里插入图片描述
在这里插入图片描述

8、编译属性页,公共语言运行时支持选择 .NET Framework 运行时支持 (/clr),.NET Framework 目标框架版本 V4.0,C++ DLL托管动态链接库和C# 引用 C++ DLL 程序的编译平台统一为 X64 或 X86。(演示为X64)

在这里插入图片描述
在这里插入图片描述

二、构建 C# 程序,引用 C++ DLL托管动态链接库

1、构建 C# .NET Framework 桌面 Windows 窗体应用

在这里插入图片描述

2、命名测试项目 TestCoord,框架版本选择 .NET Framework V4.0,和 C++ DLL托管动态链接库框架版本一致,编译 C# 引用 C++ DLL 程序的编译平台统一为 X64 或 X86。(演示为X64)

在这里插入图片描述

3、在项目中添加上面编译的 Coord.DLL 托管动态链接库,

在这里插入图片描述

3.1、窗体新建默认按钮 button1,双击 button1 按钮,进入代码编辑,

        private void button1_Click(object sender, EventArgs e){Coord coord = new Coord();//创建引用 Coord.DLL 托管动态链接库中的托管类coord.showBox();//调用类的过程showBox()}

三、验证 C++ DLL托管动态链接库 和 C# 引用 C++ DLL 的程序

在这里插入图片描述
在这里插入图片描述

四、完整项目演示代码下载

https://download.csdn.net/download/zyyujq/89705062

这篇关于C# 编译程序引用C++DLL托管动态链接库实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1131779

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

C# $字符串插值的使用

《C#$字符串插值的使用》本文介绍了C#中的字符串插值功能,详细介绍了使用$符号的实现方式,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录$ 字符使用方式创建内插字符串包含不同的数据类型控制内插表达式的格式控制内插表达式的对齐方式内插表达式中使用转义序列内插表达式中使用

C#中的Converter的具体应用

《C#中的Converter的具体应用》C#中的Converter提供了一种灵活的类型转换机制,本文详细介绍了Converter的基本概念、使用场景,具有一定的参考价值,感兴趣的可以了解一下... 目录Converter的基本概念1. Converter委托2. 使用场景布尔型转换示例示例1:简单的字符串到

电脑提示d3dx11_43.dll缺失怎么办? DLL文件丢失的多种修复教程

《电脑提示d3dx11_43.dll缺失怎么办?DLL文件丢失的多种修复教程》在使用电脑玩游戏或运行某些图形处理软件时,有时会遇到系统提示“d3dx11_43.dll缺失”的错误,下面我们就来分享超... 在计算机使用过程中,我们可能会遇到一些错误提示,其中之一就是缺失某个dll文件。其中,d3dx11_4

游戏闪退弹窗提示找不到storm.dll文件怎么办? Stormdll文件损坏修复技巧

《游戏闪退弹窗提示找不到storm.dll文件怎么办?Stormdll文件损坏修复技巧》DLL文件丢失或损坏会导致软件无法正常运行,例如我们在电脑上运行软件或游戏时会得到以下提示:storm.dll... 很多玩家在打开游戏时,突然弹出“找不到storm.dll文件”的提示框,随后游戏直接闪退,这通常是由于

MySQL多实例管理如何在一台主机上运行多个mysql

《MySQL多实例管理如何在一台主机上运行多个mysql》文章详解了在Linux主机上通过二进制方式安装MySQL多实例的步骤,涵盖端口配置、数据目录准备、初始化与启动流程,以及排错方法,适用于构建读... 目录一、什么是mysql多实例二、二进制方式安装MySQL1.获取二进制代码包2.安装基础依赖3.清

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么