封装类
using System;
using System.Data;
using System.Runtime.InteropServices;
/// <summary>
/// 非托管DLL调用类
/// </summary>
public class DllInvoke
{
private IntPtr hLib;
[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);
/// <summary>
/// dll存放的绝对路径
/// </summary>
/// <param name="DLLPath"></param>
public DllInvoke(string DLLPath)
{
hLib = LoadLibrary(DLLPath);
}
~DllInvoke()
{
FreeLibrary(hLib);
}
/// <summary>
/// 释放dll的资源
/// </summary>
public void FreeLib()
{
FreeLibrary(hLib);
}
/// <summary>
/// 创建dll中函数的委托函数
/// </summary>
/// <param name="APIName">要调用的dll的函数</param>
/// <param name="t">委托函数的类型</param>
/// <returns></returns>
public Delegate Invoke(string APIName, Type t)
{
IntPtr api = GetProcAddress(hLib, APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
}
应用以上方式,可以把非托管的dll放在网站的目录下,用相对路径进行调用。
需要特别注意的是,在部署到IIS上时,需要设置相应应用程序池的标识,否则调用会报错:IIS7(windows7)设置为管理员的账号密码,IIS6设置为本地服务即可
浙公网安备 33010602011771号