C# 调用 dll 文件

article/2025/8/27 1:52:01

一、先使用C++来创建一个 .dll 文件

1、创建新项目:CreateDll01

 

2、选择 “动态链接库(.dll)” 文件

 

3、在 CreateDll01.cpp 源文件中添加如下代码

 

// CreateDll01.cpp : 定义 DLL 应用程序的导出函数。
//#include "stdafx.h"extern "C" __declspec(dllexport) int TheAdd(int a, int b) {return a + b;
}extern "C" __declspec(dllexport) int TheSub(int c, int d) {return c - d;
}

【注意】:

  • __declspec(dllexport)  表示这个函数需要导出到 dll 中供其他程序调用。
  • extern "C"  表示以C的格式进行导出(方便用C++以外的语言进行调用)。

4、生成解决方案,来将其编译成对应的 dll 文件, dll 文件位于该项目的 Debug 目录中

  

   

 


二、C#对 .dll 文件的调用介绍

1、每种编程语言调用DLL的方法都不尽相同。在C#调用DLL中,首先需要了解什么是托管,什么是非托管。一般可以认为:非托管代码主要是基于win 32平台开发的DLL,activeX的组件,托管代码是基于.net平台开发的。

2、C#调用 DLL 非托管代码的方法:

(1)、应该在C#语言源程序中声明外部方法,其基本形式如下:

[DLLImport(“DLL文件名”)]
修饰符 extern 返回变量类型 方法名称 (参数列表)eg:[DllImport("CreateDll01.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int TheAdd(int a, int b);

(2)、用法总结

DLL文件名:要调用的外部库文件名或该文件路径,其中包含待调用的方法。
修饰符: 访问修饰符,除了abstract 以外在声明方法时可以使用的修饰符。
返回变量类型:要和 DLL文件中你需调用方法的返回值类型相同。
方法名称:在DLL文件中你需调用方法的名称(注意:该方法名称可以与 dll 文件中待调用的方法名称不同,此时需要在 DllImport() 中加上 EntryPoint 属性,让其值为DLL文件中你需调用方法的名称。相当于告诉该调用的函数入口点,然后就可以在下面的“方法名称 ”处重载该方法。若在   DllImport() 中没有 EntryPoint 属性,则需要调用的 “方法名称 ” 必须与 dll 文件中的函数名称相同 )
参数列表:在DLL文件中你需调用方法的列表。
注意:必需要在程序声明中使用 System.Runtime.InteropServices 命名空间。
DllImport只能放置在方法声明上。
DLL文件必须位于程序当前目录或系统定义的查询路径中(需要将生成的 DLL文件拷贝到当前程序的 bin\Debug 目录下)。
返回变量类型、参数列表一定要与DLL文件中的定义相一致。

DllImportAttribute 常用属性说明(详解):

CallingConvention:指定用于传递方法参数的调用约定。 默认值为 WinAPI,该值对应于基于 32 位 Intel 的平台的 __stdcall。

EntryPoint: 指定要调用 DLL 方法入口点。


三、C# 调用 .dll 文件的实例

1、创建一个新的控制台应用(.NET Framwork):CallTheDll01 . 注意:不能选择 “控制台应用(.NET Core)” ,选择该项时总是提示无法加载dll文件,使得调用 dll 文件失败。可能是由于“ 控制台应用(.NET Core)” 在VS中编译后默认无法生成 .exe 文件导致。

2、接下来在C#的Program.cs 文件中的代码会有两种引入 DLL 文件的方式:

   **************引入方式一:拷贝 dll 文件到当前项目目录下,以 dll 文件名引入该文件******************

(1)、该方式必须将之前用C++编译的 dll 文件复制到控制台应用的 bin\Debug 目录下,否则会提示错误

 

(2)、在 Program.cs 文件中添加以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;namespace CallTheDll01
{class Program{// 必须要有 CallingConvention.Cdecl,否则程序会报错[DllImport("CreateDll01.dll", CallingConvention = CallingConvention.Cdecl)]public static extern int TheAdd(int a, int b);// 若要让本程序中调用的函数名与DLL中的函数名不同,则需要在 DllImport()中添加 EntryPoint 属性// 同时 EntryPoint 属性值必须与DLL中被调函数的名称相同,以告诉该调用函数的入口位置[DllImport("CreateDll01.dll",EntryPoint ="TheSub", CallingConvention = CallingConvention.Cdecl)]public static extern int TestTheSub(int c, int d); //此时将被调函数的名称由TheSub重载为TestTheSub即可static void Main(string[] args){Console.WriteLine("The answer of 2+8 = {0}", TheAdd(2, 8));Console.WriteLine("The answer of 8-2 = {0}", TestTheSub(8, 2));Console.ReadKey();}}
}

 ****************引入方式二:通过 dll 文件的绝对路径来将该 dll 文件引入到控制台应用中***************

(1)、通过绝对路径的方式,不需要将待调用的 dll 文件复制到当前控制台应用中。只需要给出该 dll 文件的绝对路径即可。使用该方式来引入 dll 文件非常方便修改和使用。

(2)、在 Program.cs 文件中添加以下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;namespace CallTheDll01
{class Program{// 在此处使用 CreateDll01.dll 文件的绝对路径[DllImport(@"E:\Coding\C++\TheDLL\CreateDll01\Debug\CreateDll01.dll",CallingConvention=CallingConvention.Cdecl)]public static extern int TheAdd(int a, int b);// 由于上面已经使用了 CreateDll01.dll 文件的绝对路径,并且在下面的TheAdd(2, 8)处调用过该dll文件中的函数,所以// 在此处可以只写该 dll文件名,但为了保险起见,还是最好写待调用dll文件的绝对路径名[DllImport("CreateDll01.dll", EntryPoint = "TheSub",CallingConvention =CallingConvention.Cdecl)]public static extern int TestTheSub(int c, int d);static void Main(string[] args){Console.WriteLine("The answer of 2+8 = {0}", TheAdd(2, 8));Console.WriteLine("The answer of 8-2 = {0}", TestTheSub(8, 2));Console.ReadKey();}}
}

3、点击 F5 运行结果如下:

   

4、总结、注意:

  • 如果C# 调用的 DLL 文件是通过模块(.def)的方式来创建的(方法二:使用模块(.def)的方式来进行生成 .dll 文件),则可以在 .def 文件中的 EXPORTS 输出的函数名后面 @n,来指定各个函数的序号,以使其调用时让 EntryPoint 属性值用该序号来代替相应的函数名。如:[DllImport("CreateDll01.dll" , EntryPoint ="#2" , CallingConvention = CallingConvention.Cdecl)]

参考资料:

[1]  在C#中调用和调试C++代码

[2]  C# 调用外部dll

[3]  C#托管代码与C++非托管代码互相调用一

[4]  C# 中调用dll

[5]  利用C++创建DLL并C#调用


http://chatgpt.dhexx.cn/article/cKGSrqNK.shtml

相关文章

dll是什么呢?dll丢失如何解决?

DLL的概念 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件&#xff0…

C++ 制作动态链接库.dll及.dll使用

声明:IDE是Visual studio -version 2022 其制作的动态链接库dll里面实现简单的加减法,提供给其他项目调用。 一、动态链接库(DLL)创建 1、创建DLL工程 流程:文件 -> 新建 -> 项目 -> 动态链接库&#xf…

.dll、.lib、.dll.a 的区别

我们已 ffmpeg 的动态链接库为例,描述一下这三个文件的作用: 目录整体结构: 分析 bin 目录: ffmpeg、ffplay、ffprobe 之所以这么小,是因为他们运行的时候会调用 .dll 文件当中的代码。dll:真正存放函数…

Java调用dll文件

目录 1 C创建dll 1.1 项目与工具 1.2 步骤与代码 2 Java使用JNA调用dll 2.1 项目与工具 2.2 步骤与代码 3 实际效果 4 参考链接 1 C创建dll 1.1 项目与工具 Visual Studio 2019 1.2 步骤与代码 ①使用VS创建动态链接库(DLL)项目 ②设置项目名与…

什么是dll文件

动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。这些库函数的扩展名是 ”.dll"、".ocx"(包含…

什么是dll

DLL的概念 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件&#xff0c…

XWiKi 部分汉化

一、进入XWiki首页,用管理员进行登陆 账号:superadmin 密码:system 登陆后点击右上角,如下图所示 二、点开管理页面 如下图所示: 三、搜索localization 四、按照图中进行修改 然后部分汉化就完成了 当然,如…

XWiKi 汉化

进入XWiKi主页,然后点击菜单栏,进入管理,汉化前图片显示: 汉化后图片显示 一、进入安装目录/xwiki/WEB-INF/lib/下找到xwiki-platform-legacy-oldcore-10.7.jar 二、用zip解压软件进入xwiki-platform-legacy-oldcore-10.7.jar不要…

xwiki开发指南1-使用XWiki创建FAQ应用

本文是按照XWiki官网开发指南-FAQ应用创建,自己翻译总结的版本。 此篇含有大量图片,关于XWiki的开发,将在下一篇讲解。 关于XWiki的部署也会单独写一篇基于docker的部署文。 使用XWiki创建FAQ应用 1.首先下载并部署XWiki(之后会…

【Wiki】XWiki安装教程_War包版本

目录 0、XWiki说明1、war包安装说明1.1、环境说明1.2、如果懒得下载可以使用这边准备好的物料包汇总 2、war包安装2.1、Tomcat安装2.2、java安装(需要root权限)2.3 、使用 source /etc/profile 刷新linux配置2.4、数据库安装2.5、解压war包与xip2.6、修改配置文件2.6.1、修改WE…

xwiki搭建

一、Xwiki简介 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。XWiki是一款基于java所编写的wiki,它可以运行在如Tomcat,Jetty,JBoss,WebLogic,WebSphere等Servlet容器上并利用关系型数据库(HS…

XWiki在Windows上部署

简单介绍 XWiki是一款Java开发的开源文档管理系统,它简单易用,拥有强大的权限管理功能。 部署条件 JDK11(需要注意:14版本之后需要JDK11以上)、Tomcat9,XWiki 部署过程 JDK和Tomcat的部署我就贴个参考链…

开源框架XWIKI搭建介绍

原文地址:http://john88wang.blog.51cto.com/2165294/1605787 一 应用背景描述 在平时的运维工作中,把常规工作进行文档整理非常重要,无论是平时工作处理或是工作交接,实时的维护文档资料可以提高工作效率。如果采用传统的TXT文档…

xwiki安装使用以及问题解决

环境要求: jdk1.8 安装步骤: xwiki的war包下载地址:https://www.xwiki.org/xwiki/bin/view/Download/DownloadVersion/?projectVersion10.11.2 第一步:在tomcat的webapps文件下创建xwiki文件夹,将war包上传至xwik…

CentOS 7安装XWiki

目录 前言 安装步骤 安装JDK 11 安装Tomcat 9 安装xwiki 13.10.10 安装Postgres 13 设置xwiki数据路径 参考 前言 本文介绍如何在CentOS 7安装xwiki。JDK 11 Tomcat 9 xwiki 13 Postgres 13。CentOS用vagrant虚拟化的。本文代码已开源 安装步骤 安装xwiki有四个主…

XWiki开发指南3-自定义扩展jar包

简介 本文将介绍如何编写一个提供给后台接口并使用脚本在前端页面调用。 使用maven下载XWiki提供的模板项目 保证你的maven已经安装,然后执行命令 mvn archetype:generate \-DarchetypeArtifactIdxwiki-commons-component-archetype \-DarchetypeGroupIdorg.xwi…

xwiki部署_开源Wiki应用平台---XWiki的部署

部署所需要做的工作: 1.安装好MySQL(这里使用的是MySQL5.6.23),修改MySQL的my.ini配置文件(我的是手动安装版,所以在MySQL的安装目录 下),在[mysqld]下添加以下配置: max_allowed_packet32M 这里是为了增大mysql serve…

XWIKI的搭建

原文地址:https://my.oschina.net/gywbest/blog/780569 一 应用背景描述 在平时的运维工作中,把常规工作进行文档整理非常重要,无论是平时工作处理或是工作交接,实时的维护文档资料可以提高工作效率。如果采用传统的TXT文档或者Wo…

xwiki部署_xwiki8.2.1安装部署

系统环境centos 6.5 实现方式:xwikinginxtomcatmysql 包获取:http://www.xwiki.org/xwiki/bin/view/Main/Download 版本:xwiki8.2.1 nginx 随意 jdk:必须1.8 tomcat:7或者以上 mysql:5.5或者以上 nginx、jd…

xwiki部署_Linux下Xwiki安装部署详解

一、Xwiki简介 XWiki是一个由Java编写的基于LGPL协议发布的开源wiki和应用平台。XWiki是一款基于java所编写的wiki,它可以运行在如Tomcat,Jetty,JBoss,WebLogic,WebSphere等Servlet容器上并利用关系型数据库(HSQL, MyS…