在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

简介:

在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解决方案的编程环境是C#模式,这样就可以有很多智能的提示或快捷的编程方式在整个解决方案中都可以使用。

一:创建C#控制台应用程序:用于调用C++编写的DLL

(1)启动VS2015》文件》新建》项目,在弹出的新建项目对话框中按下图进行选择填写,先填写项目的名称,再修改解决方案的名称。

clip_image001

(2)项目创建后,整体效果如下图:

clip_image002

二:用C++创建DLL

下面仅仅创建了DLL,具体创建DLL的讲解请参考【在VS2015中用C++编写可被其它语言调用的动态库DLL

(1)在解决方案上右击选择【添加】>【新建项目】

clip_image003

(2)在添加新项目对话框中,按下图进行选择填写

clip_image004

(3)在下图的创建向导对话框中进行如下选择

clip_image005

(4)在下图的创建向导对话框中进行如下选择

clip_image006

(5)项目创建后,整体效果如下图:

clip_image007

(6)在【头文件】上右击进行如下选择

clip_image008

(7)在添加新项对话框中进行如下选择填写

clip_image009

(8)在CreateDLL.cpp文件中添加对CreateDLL.h的引用并且添加下图所示测试代码

clip_image010

(9)在CreateDLL.h文件中添加下图所示测试代码

clip_image011

(10)在【源文件】上右击进行如下选择

clip_image012

(11)在添加新项对话框中进行如下选择填写

clip_image013

(12)在CreateDLL.def文件中添加下图所示测试代码

clip_image014

(13)先将解决方案切换到Release模式,再在CreateDLL项目名称上右击选择【生成】或【重新生成】

注:Release模式下生成的DLL才是最终的,Debug模式下生成的DLL有时会出问题

clip_image015

(14)在解决方案所在的目录中打开Release文件夹即可看到生成的DLL

clip_image016

(15)用Dependency Walker查看导出函数名是否正确,直接将CreateDLL.dll拖到Dependency Walker软件界面即可,如下图

clip_image017

(16)使用DLL函数查看器(3.5)查看导出函数名和参数数量是否正确,直接将CreateDLL.dll拖到DLL函数查看器(3.5)软件界面即可,如下图

clip_image018

三:用C#项目调用C++创建DLL

(1)将C#项目设置为启动项目,并且将解决方案设置为Debug模式

clip_image019

(2)在C#项目的program.cs文件中编写如下代码,代码中DLL的路径中的斜杠,测试发现左斜、右斜都可以,代码中的相对路径指的是:编译后的exe程序相对于DLL的路径

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading.Tasks;

namespace CSharpCallDLL

{

class Program

{

[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test01", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]

extern static int test01(int a, int b, int c);

[DllImport(@"../../../Debug/CreateDLL.dll", EntryPoint = "test02", SetLastError = true, CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]

extern static int test02(int a, int b);

static void Main(string[] args)

{

int r1 = test01(1, 2, 3);

int r2 = test02(5, 2);

Console.WriteLine("test01结果:" + r1.ToString());

Console.WriteLine("test02结果:" + r2.ToString());

Console.ReadKey();

}

}

}

(3)运行C#项目输出结果如下

clip_image020
(4)若想实现C#调用DLL时自动进入到C++项目设置的断点,需在C#工程右键【属性】->【调试】->【启动调试器】中选中【启动本机代码调试】

clip_image021

(5)在C++项目的源码中设置断点,在Debug模式下运行C#程序会自动跳到断点处,如下图,从中可以看到C#项目中的值已经传到C++项目中了

clip_image022

(6)源码下载地址:在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试源码

(7)Dependency Walker软件下载地址:Dependency Walker动态库导出函数查看器

(8)DLL函数查看器(3.5)软件下载地址:DLL函数查看器(3.5)




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/p/5772376.html,如需转载请自行联系原作者

相关文章
|
3月前
|
监控 测试技术 C#
C# 一分钟浅谈:GraphQL 错误处理与调试
本文从C#开发者的角度,探讨了GraphQL中常见的错误处理与调试方法,包括查询解析、数据解析、权限验证和性能问题,并提供了代码案例。通过严格模式定义、详细错误日志、单元测试和性能监控等手段,帮助开发者提升应用的可靠性和用户体验。
119 67
|
4月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【11月更文挑战第6天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
174 5
|
9月前
|
编译器 C语言 C++
【VS Code】安装配置调试C/C++(一)
【VS Code】安装配置调试C/C++(一)
125 0
|
5月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
【10月更文挑战第8天】在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。
|
6月前
|
物联网 C# C语言
物联网开发中C、C++和C#哪个更好用
在物联网(IoT)开发中,C、C++和C#各有优缺点,适用场景不同。C语言性能高、资源占用低,适合内存和计算能力有限的嵌入式系统,但开发复杂度高,易出错。C++支持面向对象编程,性能优秀,适用于复杂应用,但学习曲线陡峭,编译时间长。C#易于学习,与.NET框架结合紧密,适合快速开发Windows应用,但性能略低,平台支持有限。选择语言需根据具体项目需求、复杂性和团队技术栈综合考虑。
|
6月前
|
Ubuntu Linux Shell
C++ 之 perf+火焰图分析与调试
简介 在遇到一些内存异常的时候,经常这部分的代码是很难去进行分析的,最近了解到Perf这个神器,这里也展开介绍一下如何使用Perf以及如何去画火焰图。 1. Perf 基础 1.1 Perf 简介 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件 1.2 Perf的安装 ubuntu 18.04: sudo apt install linux-tools-common linux-tools-4.15.0-106-gen
135 2
|
5月前
|
C#
Delphi可不可以制作出像c#那样的dll类库?
在Delphi中,创建DLL项目(如dll.dpr)并定义一个类TMyCls后,在另一个项目(如test.dpr)中可以引入此DLL并直接实例化和调用类的方法。然而,Delphi目前主要支持两种DLL形式:动态链接库(需显式声明exports,仅支持函数调用)和ActiveX DLL(需定义IDL接口)。这两种方式都较为繁琐。相比之下,C# 的DLL类库更为便捷,编写并编译后即可在其他项目中直接使用。
|
7月前
|
存储 C++
C++ dll 传 string 类 问题
C++ dll 传 string 类 问题
61 0
|
7月前
|
C#
C# WPF 将第三方DLL嵌入 exe
C# WPF 将第三方DLL嵌入 exe
140 0
|
7月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件