ASP.net动态调用非托管DLL的参数传递问题
来源:互联网 发布:cf救世主的枪数据 编辑:程序博客网 时间:2024/05/12 07:42
ASP.net动态调用非托管DLL的参数传递问题
作者:骄傲的猫
出处:http://blog.csdn.net/shardowm
最近由于工作的原因碰到了在ASP.net调用非托管DLL参数传递的问题,结果花了半天时间终于比较完美的解决。特此写这篇文章与大家分享。这里主要讲解调用DLL时 参数传递的问题,对于如何调用非托管DLL网上有很多文章这里就不在重复了。
LibInvoke是在ASP.net环境下调用非托管DLL了,在类中Invoke方法创建DLL中指定方法的Delegate 对象。
public class LibInvoke
...{
...
public Delegate Invoke(string APIName, Type t)
...{
if (hLib == IntPtr.Zero)
throw(new Exception("未载入有效的DLL模块, 请确认DLL文件: " + strDLL + "是否有效!" ));
IntPtr hApi = IntPtr.Zero;
hApi = GetProcAddress(hLib, APIName);
if (hApi == IntPtr.Zero)
throw(new Exception("无效的函数名: " + APIName));
return Marshal.GetDelegateForFunctionPointer(hApi, t);
}
}
...{
...
public Delegate Invoke(string APIName, Type t)
...{
if (hLib == IntPtr.Zero)
throw(new Exception("未载入有效的DLL模块, 请确认DLL文件: " + strDLL + "是否有效!" ));
IntPtr hApi = IntPtr.Zero;
hApi = GetProcAddress(hLib, APIName);
if (hApi == IntPtr.Zero)
throw(new Exception("无效的函数名: " + APIName));
return Marshal.GetDelegateForFunctionPointer(hApi, t);
}
}
一. 内置类型
对于内置类型(整型、布尔型、字符型)参数的传递是最简单的,只要直接传参数,并且直接处理返回值就可以了。
private delegate bool Func1(int a, char b);
public bool BaseTypeTest
...{
Func1 fun = (Func1)objInvoke.Invoke("BaseTypeTest", typeof(Func1));
bool res = fun(1, 'A');
return res
}
public bool BaseTypeTest
...{
Func1 fun = (Func1)objInvoke.Invoke("BaseTypeTest", typeof(Func1));
bool res = fun(1, 'A');
return res
}
二. 字符串类型
传入字符串时由于字符串编码问题的,有可能造成字符串到DLL中后变成乱码,所以在这里现将字符串都转换成byte型的数组,然后再作为参数传入到dll的函数中。
private delegate bool Func2(byte[] _appID, byte[] _paramVal);
public bool StringTypeTest1(string appID, string paramValue)
...{
Encoding e1 = Encoding.GetEncoding(936);
byte[] b1 = e1.GetBytes(appID);
byte[] b2 = e1.GetBytes(paramValue);
Func2 func = (Func2)objInvoke.Invoke("StringTypeTest1", typeof(Func2));
bool result = func(b1, b2);
return result;
}
public bool StringTypeTest1(string appID, string paramValue)
...{
Encoding e1 = Encoding.GetEncoding(936);
byte[] b1 = e1.GetBytes(appID);
byte[] b2 = e1.GetBytes(paramValue);
Func2 func = (Func2)objInvoke.Invoke("StringTypeTest1", typeof(Func2));
bool result = func(b1, b2);
return result;
}
如果dll中要返回一个字符串,则返回字符串只能作为函数的引用参数,而不能直接让函数返回一个字符串。以下代码就是调用dll中的
void StringTypeTest2(char** a)
函数。
private delegate void Func3(out StringBuilder ret);
public string StringTypeTest2
...{
StringBuilder obj= new StringBuilder();
Func3 func= (_Author)objInvoke.Invoke("StringTypeTest2", typeof(Func3));
func(out obj);
return obj.ToString();
}
public string StringTypeTest2
...{
StringBuilder obj= new StringBuilder();
Func3 func= (_Author)objInvoke.Invoke("StringTypeTest2", typeof(Func3));
func(out obj);
return obj.ToString();
}
所以在这里应该注意,在实现返回string或对象类型的函数是,不要让函数直接返回字符串或对象,而应把需要返回的字符串或对象作为引用参数。
参考文献:
[1] 《在 C# 中通过 P/Invoke 调用Win32 DLL》 Jason Clark ,
网址:http://www.microsoft.com/china/msdn/library/langtool/vcsharp/ousNET.mspx
- ASP.net动态调用非托管DLL的参数传递问题
- ASP.net动态调用非托管DLL的参数传递问题
- ASP.NET中调用非托管DLL的问题
- C#调用非托管dll的参数传递设置
- C#中调用非托管的DLL及参数传递
- C#中调用非托管的DLL及参数传递
- 使用C#.net调用非托管DLL遇到的问题
- C#.Net调用非托管的DLL
- 非托管Dll动态调用
- C#中调用非托管的DLL及参数传递 (一)
- 托管非托管Dll动态调用
- 托管非托管Dll动态调用
- C# 调用非托管dll提供接口参数 结构类型 的转换问题。
- 托管调用非托管的DLL
- C#程序实现动态调用非托管的DLL文件
- C#程序实现动态调用非托管的DLL文件
- C#程序实现动态调用非托管的DLL文件
- C#程序实现动态调用非托管的DLL文件
- 经典:单件模式(Singleton Pattern)
- 动力的来源
- 把从其他系统传过来的自开放程序重置为orginal
- 技巧:删除表中重复数据的几种方法
- 只运行一个实例程序
- ASP.net动态调用非托管DLL的参数传递问题
- 2007年“网络十大炒女”排行榜
- 网址
- Struts实现多国语言切换
- 中国最大在线保健品供应商“健康中国”停业
- 加入注册表,开机运行
- 奋斗在上海滩
- PHP通用文件上传类
- windows系统服务程序的开发