ASP.NET调用DLL
2017-01-08 11:19
351 查看
public partial class _1 : System.Web.UI.Page
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeLibrary(IntPtr hModule);
delegate void DllRegisterServerInvoker(IntPtr ip, IntPtr buff);
protected void Page_Load(object sender, EventArgs e)
{
string s = Request.Params["text"];
IntPtr hDll = LoadLibrary(Server.MapPath(@"~/FindIP.dll"));
IntPtr hProc = GetProcAddress(hDll, "_FindIP");
DllRegisterServerInvoker drs = (DllRegisterServerInvoker)Marshal.GetDelegateForFunctionPointer(hProc, typeof(DllRegisterServerInvoker));
string strIP = s;
IntPtr memip = Marshal.StringToCoTaskMemAnsi(strIP);
IntPtr membuff = Marshal.AllocHGlobal(100);// 直接分配100 byte的内存
drs(memip, membuff);
string str = Marshal.PtrToStringAnsi(membuff);
FreeLibrary(hDll);
Response.Write(str);
}
}
调用DLL要注意几个问题
1.DLL自身权限问题,因为可能写入权限不足造成失败。
2.传到服务器上时,修改应用程序池---启动32位应用程序--TRUE
{
[DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)]string lpFileName);
[DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
[DllImport("kernel32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool FreeLibrary(IntPtr hModule);
delegate void DllRegisterServerInvoker(IntPtr ip, IntPtr buff);
protected void Page_Load(object sender, EventArgs e)
{
string s = Request.Params["text"];
IntPtr hDll = LoadLibrary(Server.MapPath(@"~/FindIP.dll"));
IntPtr hProc = GetProcAddress(hDll, "_FindIP");
DllRegisterServerInvoker drs = (DllRegisterServerInvoker)Marshal.GetDelegateForFunctionPointer(hProc, typeof(DllRegisterServerInvoker));
string strIP = s;
IntPtr memip = Marshal.StringToCoTaskMemAnsi(strIP);
IntPtr membuff = Marshal.AllocHGlobal(100);// 直接分配100 byte的内存
drs(memip, membuff);
string str = Marshal.PtrToStringAnsi(membuff);
FreeLibrary(hDll);
Response.Write(str);
}
}
调用DLL要注意几个问题
1.DLL自身权限问题,因为可能写入权限不足造成失败。
2.传到服务器上时,修改应用程序池---启动32位应用程序--TRUE
相关文章推荐
- ASP.NET Zero--3.菜单配置
- ASP.NET Core 中的那些认证中间件及一些重要知识点
- kali-sqlmap-asp网站渗透
- ASP.NET界面重定向传值
- 树莓派修改开机图片
- 树梅派应用48: 在树莓派2上安装 Windows 10
- 树梅派应用47:用树莓派给智能手机发送推送通知
- 树梅派应用45:树莓派上的软件安装和卸载命令汇总
- ASP.NET应用程序与页面生命周期
- ASP常见漏洞大全
- ASP注入漏洞全接触
- asp.net点选验证码实现思路分享 (附demo)
- iis支持asp.net4.0的注册命令使用方法
- aop aspect controller
- Opserver开源的服务器监控系统(ASP.NET)
- 解决ASP.NET上传文件大小限制
- ssh链接不到树莓派raspberry pi
- C#关键字partial在asp.net mvc中的应用
- [转]ASP.NET Core--根据方案来限制身份
- spring 4.0 AOP (使用AspectJ的注解方式 的aop实现)简单实例