当前位置: 首页 > 编程日记 > 正文

C#创建和调用DLL

一、写在前面
C# 语言是一种简单但功能强大的编程语言,用于编写企业应用程序。

C# 语言从C和 C++语言演化而来,在语句、表达式和运算符方面使用了许多 C++ 功能。

C# 语言在类型安全性、版本转换、事件和垃圾回收等方面进行了相当大的改进和创新。

C# 语言提供对常用 API 样式(如 .NET 框架、COM、自动化和 C 样式 API 等)的访问。

什么是动态链接库?DLL三个字母对于你来说一定很熟悉吧,它是Dynamic Link Library 的缩写形式,动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

和大多数程序员一样,你一定很使用过DLL吧。也曾感受到它的带给你程序设计和编码上的好错吧今天我想和大家探讨一个主题:如何在C#创建和调用DLL(动态链接库), 其实在很大意义上而讲,DLL让我更灵活的组织编写我们的应用程序,作为软件设计者,可一个根据它来达到很高的代码重用效果。下面我来介绍一下在C#中如何创建和调用DLL。



二、准备工作



我们需要对我们接下来要做的事情做个简单的介绍,在本文我们将利用C#语言创建一个名为 MyDLL.DLL的动态链接库,在这个动态链接库文件中我们将提供两个功能一个是对两个参数交换他们的值,另一个功能是求两个参数的最大公约数。然后创建一个应用程序使用这个DLL。运行并输出结果。



三、创建DLL



让我们创建以下三个C#代码文件:

1、 MySwap.cs

using System;

namespace MyMethods

{

public class SwapClass

{

public static bool Swap(ref long i,ref long j)

{

i = i+j;

j = i-j;

i = i-j;

return true;

}

}

}



2、 MyMaxCD.cs

using System;

namespace MyMethods

{

public class MaxCDClass

{

public static long MaxCD(long i, long j)

{

long a,b,temp;

if(i>j)

{

a = i;

b = j;

}

else

{

b = i;

a = j;

}

temp = a % b;

while(temp!=0)

{

a = b;

b = temp;

temp = a % b;

}

return b;

}

}

}

}需要注意的是:我们在制作这两个文件的时候可以用Visual Studio.NET或者其他的文本编辑器,就算是记事本也可以。这两个文件虽然不在同一个文件里面,但是他们是属于同一个namespace(名称空间)这对以后我们使用这两个方法提供了方便。当然他们也可以属于不同的名称空间,这是完全可以的,但只是在我们应用他们的时候就需要引用两个不同的名称空间,所以作者建议还是写在一个名称空间下面比较好。
接下来的任务是把这两个cs文件变成我们需要的DLL文件。方法是这样的:
在安装了Microsoft.NET Framework的操作系统上,我们可以在Windows所在目录下找到Microsoft.NET目录。在这个目录下面提供了C#的编译器,CSC.EXE
运行:csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.cs
完成后可在本目录下面找到我们刚才生成的MyDLL.DLL文件
/target:library 编译器选项通知编译器输出 DLL 文件而不是 EXE 文件。后跟文件名的 /out 编译器选项用于指定 DLL 文件名。
如果/out后面不跟文件名编译器使用第一个文件 (MySwap.cs) 作为 DLL 文件名。生成的文件为MySwap.DLL文件
OK!我们创建动态链接库文件的任务完成了,现在是我们享受劳动成果的时候了,下面我将介绍如何使用我们所创建的动态链接库文件。

四、 使用DLL

我们简单写一个小程序来测试一下我们刚才写的两个方法是否正确,好吧,跟我来:
MyClient.cs
using System;

using MyMethods;

//这里我们引用刚才定义的名称空间,如果刚才的两个文件我们写在两个不同的名称空间
class MyClient

{

public static void Main(string[] args)

{

if (args.Length != 2)

{

Console.WriteLine("Usage: MyClient <num1> <num2>");

return;

}

long num1 = long.Parse(args[0]);

long num2 = long.Parse(args[1]);

SwapClass.Swap(ref num1,ref num2);

// 请注意,文件开头的 using 指令使您得以在编译时使用未限定的类名来引用 DLL 方法

Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);

long maxcd = MaxCDClass.MaxCD(num1,num2);

Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);

}

}

若要生成可执行文件 MyClient.exe,请使用以下命令行:

csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs

/out 编译器选项通知编译器输出 EXE 文件并且指定输出文件名 (MyClient.exe)。/reference 编译器选项指定该程序所引用的 DLL 文件。



五、执行



若要运行程序,请输入 EXE 文件的名称,文件名的后面跟两个数字,例如:

MyClient 123 456



六、输出



The result of swap is num1 = 456 and num2 = 123

The MaxCD of 456 and 123 is 3



七、小结

动态链接具有下列优点:

节省内存和减少交换操作。很多进程可以同时使用一个 DLL,在内存中共享该 DLL 的一个副本。相反,对于每个用静态链接库生成的应用程序,Windows 必须在内存中加载库代码的一个副本。
节省磁盘空间。许多应用程序可在磁盘上共享 DLL 的一个副本。相反,每个用静态链接库生成的应用程序均具有作为单独的副本链接到其可执行图像中的库代码。
升级到 DLL 更为容易。DLL 中的函数更改时,只要函数的参数和返回值没有更改,就不需重新编译或重新链接使用它们的应用程序。相反,静态链接的对象代码要求在函数更改时重新链接应用程序。
提供售后支持。例如,可修改显示器驱动程序 DLL 以支持当初交付应用程序时不可用的显示器。
支持多语言程序。只要程序遵循函数的调用约定,用不同编程语言编写的程序就可以调用相同的 DLL 函数。程序与 DLL 函数在下列方面必须是兼容的:函数期望其参数被推送到堆栈上的顺序,是函数还是应用程序负责清理堆栈,以及寄存器中是否传递了任何参数。
提供了扩展 MFC 库类的机制。可以从现有 MFC 类派生类,并将它们放到 MFC 扩展 DLL 中供 MFC 应用程序使用。
使国际版本的创建轻松完成。通过将资源放到 DLL 中,创建应用程序的国际版本变得容易得多。可将用于应用程序的每个语言版本的字符串放到单独的 DLL 资源文件中,并使不同的语言版本加载合适的资源。
使用 DLL 的一个潜在缺点是应用程序不是独立的;它取决于是否存在单独的 DLL 模块。


相关文章:

死磕算法!35 篇算法设计实例+6 本必读书打包送你

算法为什么难学&#xff1f;算法在程序中扮演着非常重要的角色&#xff0c;有人将数据结构比喻为程序的骨架&#xff0c;将算法比喻为程序的灵魂&#xff0c;这一点也不为过&#xff0c;正是因为这一点&#xff0c;很多朋友都立志要学好算法&#xff0c;但是我常常看到各种抱怨…

EXCHANGE证书

证书&#xff1a; CA&#xff08;证书颁发机构&#xff09;和证书有什么区别&#xff1f; CA&#xff1a;是服务器中的一个服务&#xff0c;主要是用来为计算机&#xff08;用户&#xff09;来颁发证书&#xff0c;安装CA的服务器称为证书服务器&#xff0c; 证书&#xff1a;从…

C#2.0模拟List和内置算法

C#中的范型对于很多从C转过来的程序员来说&#xff0c;可以说是一个天大的喜讯。hehe&#xff0c;至少笔者对于这个新特性是充满了敬仰之情。 在C#2.0中&#xff0c;匿名方法、IEnumerable接口和匿名方法的合作&#xff0c;使很多的编程任务变得非常的简单&#xff0c;而且写出…

​横扫六大权威榜单后,达摩院开源深度语言模型体系 AliceMind

整理 | AI 科技大本营&#xff08;ID:rgznai100&#xff09;自然语言处理&#xff08;NLP&#xff09;被誉为 AI 皇冠上的明珠&#xff0c;传统 NLP 模型制作复杂&#xff0c;耗时耗力&#xff0c;且用途单一&#xff0c;难以复用。预训练语言模型是 NLP 领域的研究热点之一&am…

WP8:Unity3D之间的值传递

原地址&#xff1a;http://www.cnblogs.com/zhxilin/p/3799210.html 在前面的讨论中&#xff0c;我们介绍了如何在Unity3D for WP8中使用高于.Net 3.5的第三方库&#xff0c;传送门:http://www.cnblogs.com/zhxilin/p/3311240.html 在Unity3D和WP8的交互当中&#xff0c;如果要…

未来的程序员面临着怎样的职业变化

作为程序员&#xff0c;我们总是身处于如万花筒般变化无常的技术世界里。我们可能也是那群能够最早感知到科技变化所带来巨大影响的人。然而&#xff0c;面对这一波又一波向我们袭来的技术变革&#xff0c;我们是否也能从中窥见一丝规律&#xff0c;从而使自己更好地应对未来呢…

C#中使用Win32和其他库

C# 用户经常提出两个问题&#xff1a;“我为什么要另外编写代码来使用内置于 Windows 中的功能&#xff1f;在框架中为什么没有相应的内容可以为我完成这一任务&#xff1f;”当框架小组构建他们的 .NET 部分时&#xff0c;他们评估了为使 .NET 程序员可以使用 Win32 而需要完成…

神经网络的学习方式网络传播和图卷积,两者到底什么关系?

作者 | Remy Lau本文转载自CSDN博主「deephub」你可能听说过图卷积&#xff0c;因为它在当时是一个非常热门的话题。虽然不太为人所知&#xff0c;但网络传播是计算生物学中用于网络学习的主要方法。在这篇文章中&#xff0c;我们将深入研究网络传播背后的理论和直觉&#xff0…

string与数值之间的转换

9.50 编写程序处理一个vector<string>,其元素都表示整数型。计算vector中所有元素之和。修改程序&#xff0c;使之计算表示浮点值的string之和。 程序如下&#xff1a; #include<string> #include<vector> #include<iostream> using namespace std;int…

一个完整的大作业

1.选一个自己感兴趣的主题。网址为http://news.gzcc.cn/html/xiaoyuanxinwen/ 2.网络上爬取相关的数据 import requests import re from bs4 import BeautifulSoup urlhttp://news.gzcc.cn/html/xiaoyuanxinwen/ resrequests.get(url) res.encodingutf-8 soupBeautifulSoup(res…

剖析C#的多态

一、什么是多态 面向对象程序设计中的另外一个重要概念是多态性。在运行时&#xff0c;可以通过指向基类的指针&#xff0c;来调用实现派生类中的方法。可以把一组对象放到一个数组中&#xff0c;然后调用它们的方法&#xff0c;在这种场合下&#xff0c;多态性作用就体现出来了…

OSPF单区域配置

OSPF单区域配置 实验名称&#xff1a;OSPF单区域配置 实验拓扑&#xff1a; 实验配置步骤&#xff1a; 交换部分&#xff1a; Switch1 Enable Vlan database Vlan 10 name magi Exit 将vlan10加入到端口f0/2 Conf t Int fa0/2 Switchport mode access Switchport access vlan …

一文搞定7大流行后端框架:Spring、Netty、MyBatis、Hibernate、Dubbo...

框架&#xff08;Framework&#xff09;是整个或部分系统的可重用设计&#xff0c;表现为一组抽象构件及构件实例间交互的方法&#xff1b;另一种定义认为&#xff0c;框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。 可以说&#xff0c;…

全“芯”关注用户需求 AMD“超轻薄笔记本”杀出重围

现在10.6寸跟11.6寸的笔记本已经占据整个笔记本市场的15%左右&#xff0c;跟过去只有几个点相比&#xff0c;已经有很大的提升了&#xff0c;几乎是百分之百的提升&#xff0c;超轻薄笔记本是大势所趋。这种趋势也带动了两大芯片巨头英特尔和AMD的角逐&#xff0c;英特尔为新一…

“去了太空就别回来了!”贝索斯还没“上天”,就遭美国 5 万多人请愿:不准重返地球...

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;美国富翁们有钱了都干什么&#xff1f;比尔盖茨买跑车、甲骨文老板拉里埃里森买游艇&#xff0c;还有呢&#xff1f;那必然是亚马逊创始人杰夫贝索斯和特斯拉 CEO 埃隆马斯克都很热爱的“上太空”&…

C语言中的字符串处理

•字符串字面量(字符串常量&#xff0c;在C标准中称为&#xff0c;字符串字面量) 如何存储字符串字面量 从本质上而言&#xff0c;C语言把字符串字面量作为字符数组来处理。当C语言编译器在程序中遇到长度为n的字符串字面量时&#xff0c;它会为字符串字面量分配长度为n1的…

php 派生类 数据库连接 单例模式 xhprof实测 高效连接

2019独角兽企业重金招聘Python工程师标准>>> 、 <?php //要解决的问题 在一个方法中多次调用类 //多次调用父类相同的类 class Pdoo {public function __construct(){}//这是个数据库的类function select($name) {echo "正宗" . $name;} } class Con…

安装MariaDB

结果我还是成功安装了MariaDB&#xff0c;其实大部分时候系统的操作不会有什么问题的&#xff0c;只是有时候会遇到一些问题较折腾。 最简单的指南&#xff1a;https://www.linode.com/docs/databases/mariadb/how-to-install-mariadb-on-centos-7 根据stackoverflow网友的说法…

CentOS5.6下安装Oracle10G软件 【保留报错经验】

CentOS5.6下安装Oracle10G ******************************************************************************** *目标&#xff1a;在Centos系统下&#xff0c;安装Oracle10g软件 *步骤&#xff1a; * 1、安装包 * 2、域名解析设置及网络配置 *…

人大团队研究:面向文本生成,预训练模型进展梳理

作者 | 刘媛媛来源 | 数据实战派文本生成是 NLP 中最重要且颇具挑战性的任务之一。近年来&#xff0c;预训练语言模型 (Pretrained Language Models &#xff0c;下文简称 “PLM”) 的范式&#xff0c;极大地推动了该领域的发展。例如&#xff0c;我们曾介绍过 AI 在古诗生成上…

用C#编写获取远程IP,MAC的方法

如果要想获得远程的地址&#xff0c;需要用sendarp这个函数来实现。具体的代码如下&#xff1a; [DllImport("Iphlpapi.dll")] private static unsafe extern int SendARP(Int32 dest,Int32 host,ref IntPtr mac,ref IntPtr length); [DllImport("Ws2_32.dll…

纯JS导出excel(支持中文)

JsonExportExcel 简介 github EXAMPLE 使用方法 1.引入js (dist目录下JsonExportExcel.min.js) <script src"https://cuikangjie.github.io/JsonExportExcel/dist/JsonExportExcel.min.js"></script>npm install -save js-export-excelconst ExportJson…

C#如何取硬件标志

using System; using System.Runtime.InteropServices; using System.Management; namespace Hardware { /// <summary> /// Hardware_Mac 的摘要说明。 /// </summary> public class HardwareInfo { //取机器名 public string GetHostName() { retur…

Java发送邮件工具类(可发送匿名邮件)

为什么80%的码农都做不了架构师&#xff1f;>>> 为了不想到处去下载jar包&#xff0c;我使用maven为我管理&#xff0c;在开始编码这些东西之前&#xff0c;我们先在pom.xml文件中<dependencies>标签内加入以下内容&#xff1a; <!-- Following jars are …

华为、百度、小米踏上造车新征程,软件如何吞噬汽车?

【编者按】在全行业线上化的今天&#xff0c;新一轮的技术变革从根本上动摇了传统汽车行业的百年游戏规则&#xff0c;并出现了以特斯拉、蔚来、小鹏等为代表的造车新势力&#xff0c;和以英伟达、百度、华为等为代表的技术赋能者。传统汽车企业如何应对才能拿到行业变革的门票…

js同时打开两个连接

js同时打开两个、多个连接 <html xmlns"http://www.w3.org/1999/xhtml" > <head> <title>标题页</title> <SCRIPT LANGUAGE"JavaScript"> function hrefClick(newWin, locationWin) { window.open(newWin); //打开…

C#下用P2P技术实现点对点聊天

.NET将关于多线程的功能定义在System.Threading名字空间中。因此&#xff0c;要使用多线程&#xff0c;必须先声明引用此名字空间&#xff08;using System.Threading;&#xff09;。 即使你没有编写多线程应用程序的经验&#xff0c;也可能听说过“启动线程”“杀死线程”这些…

Java全能手册火了!Redis/Nginx/Dubbo/Spring全家桶/啥都有

前言本文是为了帮大家快速回顾了Java中知识点&#xff0c;这套面试手册涵盖了诸多Java技术栈的面试题和答案&#xff0c;相信可以帮助大家在最短的时间内用作面试复习&#xff0c;能达到事半功倍效果。本来想将文件上传到github上&#xff0c;但由于文件太大有的都无法显示所以…

关于小数的精确运算

package test;import java.math.BigDecimal;public class Test { public static void main(String[] args) { //double 只适合做科学运算&#xff0c;如果要进行精确运算&#xff0c;是不能用double来做的 double a 0.1; double b 0.006; Sys…

转载:什么才是程序员的核心竞争力

下文转载自http://www.cnblogs.com/ajianbeyourself/p/4189449.html&#xff0c;版权归原作者所有。 文章格式略有编辑&#xff0c;内容稍作整理&#xff0c;应该不影响原意。 1.对人的态度&#xff0c;对待工作和问题的态度&#xff0c;技术能力&#xff0c;我认为这是做技术的…