C#项目中如何调用C#写的dll中的资源文件,如 xml文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#项目中如何调用C#写的dll中的资源文件,如 xml文件相关的知识,希望对你有一定的参考价值。

如何利用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; 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; 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); 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 模块。

参考资料:http://www.legalsoft.com.cn/docs/841.html

参考技术A 用ResourceManager

System.Resources.ResourceManager RM = new System.Resources.ResourceManager(typeof(MyProjectBase));
RM.GetObject("i.jpg");本回答被提问者采纳

VS如何在调试时进入到dll文件

背景:

    项目A:用C#写的一个类库文件
  项目B:引用项目A的dll文件,完成编码,也是C#编写的。

  需求:怎么能在调试的时候,调试断点能够从项目B中进入项目A中的代码。

解决办法就是:

  假设,项目B引用的项目A的dll文件是 a.dll ,并且a中没有引用项目A中其他的文件或者命名空间。如果a.dll中还引用了A项目下的其他命名空间的内容,如a2,那么在下面的操作也要包含a2的对应部分。

  将项目A下A.Web文件夹下bin文件夹(即路径:A/A.Web/bin/ )下的 a.dll与a.pdb文件,同时拷贝到B项目的外部引用文件夹下。这个"同时" 的含义是保证dll与pdb文件是同一个版本的。也就是说,你不能用时间点1的dll配合时间点2的pdb文件来进行调试进入dll的操作。如果a中还引用了a2命名空间的内容,那么必须也将a2.dll与a2.pdb文件同时拷贝过去,这个同时的含义同上。并且这个a2与a也是同时的。

  这些准备好了之后,B项目中重新生成,在B项目中,在你引用a.dll中函数的地方加断点,单步调试即可进入A项目中对应的被调函数。

表达上可能有含糊或者不准确的地方,还请批评指正。

 

实例说明:

  在PMCost项目中,部分代码如下,19行红色框内的函数引用自ACore项目中的Common命名空间下AjaxMethodAttribute.cs,我们知道,在生成dll的时候AjaxMethodAttribute.cs下的函数会被包含在ACore.Common.dll下。

技术分享图片

  并且AjaxMethodAttribute.cs中只引用了system及其两个子类,并没有引用 PMCost项目下的其他自定义命名空间。所以在拷贝的时候只需要拷贝ACore.Common.dll 及ACore.Common.pdb即可。

技术分享图片

技术分享图片

 

将两个文件拷贝到PMCost项目的外部引用中,在函数调用位置之前加断点,单步调试即可进入dll中。

技术分享图片

 技术分享图片

 


以上是关于C#项目中如何调用C#写的dll中的资源文件,如 xml文件的主要内容,如果未能解决你的问题,请参考以下文章

PB调用C#编写的Dll类库

C#如何静态调用C++中的方法(静态调用dll)

Delphi程序怎么调用C#写的dll类库

c# wpf项目中引用的dll怎么让它能自动更新?

VS如何在调试时进入到dll文件

如何从 c++ 项目中调用用 c# 创建的 dll 文件? [复制]