Lonz's 网络文档集

在C#里如何调用标准DLL函数

在C#里只需要调用PInvoke (Platform Invocation) 服务。C# 支持一种sysimport属性
支持这种调用。
下面是完整的语法形式(在例子里没有用到所有的参数):

[sysimport(
dll=dllName,
name=functionName,
charset=characterSetToBeUsed)
]

给出一个调用Win32 MessageBox函数的例子:

using System;

class pinvokeClient
{
[sysimport(dll="user32.dll")]

public static extern int MessageBoxA(int hwnd, string message,
string caption, int type);

public static void Main()
{
int result = MessageBoxA(0, "Hello World", "PInvoke Test", 0);
}
}


这里讲述的是C#调用标准动态库的问题, 在我以前的文件中讲到过, C#调用Win32API, 原理是一样的. 这里我详细讲解用C写一个标准的动态库, 然后让C#调用. (本篇适合初学者, 中间没有任何冗余代码, 简洁明了)
软件环境: VC6.0(当然其他版本的VC5也可以)
1.制作标准动态库
__declspec(dllexport) int __cdecl add(int, int);//这一句是声明动态库输出一个可供外不调用的函数原型.
int add(int a,int b) {//实现这个函数
return a+b;
}
以上简单3行代码,声明一个add的方法, 输入参数是两个int参数,返回这两个数之和. 保存为MyLib.c
然后执行编译命令.
H:\XSchool\C#-School\HowTo>cl /LD MyLib.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

MyLib.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:MyLib.dll
/dll
/implib:MyLib.lib
MyLib.obj
Creating library MyLib.lib and object MyLib.exp

确信有以上输出, 说明编译成功生成了动态库.

2.编写C-Sharp程序调用该动态库
using System;
using System.Runtime.InteropServices;//这是用到DllImport时候要引入的包

public class InvokeDll {
[DllImport("MyLib.dll", CharSet=CharSet.Auto)]
static extern int add(int a,int b);//声明外部的标准动态库, 跟Win32API是一样的.

public static void Main() {
Console.WriteLine(add(10,30));
}
}
保存为InvokeDll.cs文件, 与MyLib.dll置于同一目录, 编译该文件.
H:\XSchool\C#-School\HowTo>csc invokedll.cs
将生成Invokedll.exe, 可以执行该文件.
以上是C-Sharp调用标准动态库的全过程.


posted on 2006-08-04 14:29  Lonz's 网络文档集  阅读(795)  评论(0编辑  收藏  举报

导航