ASP.NET/C#中如何调用动态链接库DLL(2)

然后在“B1_Click”方法体内添加如下代码,以调用方法“MsgBox”:
MsgBox(0," 这就是用 DllImport 调用 DLL 弹出的提示框哦! "," 挑战杯 ",0x30);
6. 按“F5”运行该程序,并点击按钮B1,便弹出如下提示框:

7.代码如下:

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsFormsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll", EntryPoint = "MessageBoxA")] static extern int MsgBox2(int hWnd, string msg, string caption, int type); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { MsgBox2(0, " 这就是用 DllImport 调用 DLL 弹出的提示框哦! ", " 挑战杯 ", 0x30); } private void button2_Click(object sender, EventArgs e) { MsgBox2(0, " 这就是用 DllImport 调用 DLL 弹出的提示框哦222222f! ", " 222222 ", 0x30); } } }

(二)     动态装载、调用DLL中的非托管函数
在上面已经说明了如何用DllImport调用DLL中的非托管函数,但是这个是全局的函数,假若DLL中的非托管函数有一个静态变量S,每次调用这个函数的时候,静态变量S就自动加1。结果,当需要重新计数时,就不能得出想要的结果。下面将用例子说明:
1.  DLL的创建
1) 、启动Visual C++ 6.0;
2) 、新建一个“Win32 Dynamic-Link Library”工程,工程名称为“Count”;
3) 、在“Dll kind”选择界面中选择“A simple dll project”;
4) 、打开Count.cpp,添加如下代码:

// 导出函数,使用“ _stdcall ” 标准调用 extern "C" _declspec(dllexport)int _stdcall count(int init); int _stdcall count(int init) {//count 函数,使用参数 init 初始化静态的整形变量 S ,并使 S 自加 1 后返回该值 static int S=init; S++; return S; }

5) 、按“F7”进行编译,得到Count.dll(在工程目录下的Debug文件夹中)。
2.   用DllImport调用DLL中的count函数
1) 、打开项目“Tzb”,向“Form1”窗体中添加一个按钮。
2) 、改变按钮的属性:Name为 “B2”,Text为 “用DllImport调用DLL中count函数”,并将按钮B1调整到适当大小,移到适当位置。
3) 、打开“Form1.cs”代码视图,使用关键字 static 和 extern 声明方法“count”,并使其具有来自 Count.dll 的导出函数count的实现,代码如下:

[DllImport("Count.dll")] static extern int count(int init);

4) 、 在“Form1.cs[设计]”视图中双击按钮B2,在“B2_Click”方法体内添加如下代码:
MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 0 ,得到的结果是: "+count(0).ToString()," 挑战杯 ");
MessageBox.Show(" 用 DllImport 调用 DLL 中的 count 函数, n 传入的实参为 10 ,得到的结果是: "+count(10).ToString()+"n 结果可不是想要的 11 哦!!! "," 挑战杯 ");
MessageBox.Show(" 所得结果表明: n 用 DllImport 调用 DLL 中的非托管 n 函数是全局的、静态的函数!!! "," 挑战杯 ");
5) 、把Count.dll复制到项目“Tzb”的binDebug文件夹中,按“F5”运行该程序,并点击按钮B2,便弹出如下三个提示框:

第1个提示框显示的是调用“count(0)”的结果,第2个提示框显示的是调用“count(10)”的结果,由所得结果可以证明“用DllImport调用DLL中的非托管函数是全局的、静态的函数”。所以,有时候并不能达到我们目的,因此我们需要使用下面所介绍的方法:C#动态调用DLL中的函数。
3. C#动态调用DLL中的函数
因为C#中使用DllImport是不能像动态load/unload assembly那样,所以只能借助API函数了。在kernel32.dll中,与动态库调用有关的函数包括:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwgps.html