asp.net下LoadLibrary加载dll的问题
/// <summary>
/// 调用非托管dll
/// </summary>
class DLLInvoke
{
[DllImport(" kernel32.dll ")]
public
extern
static
int
LoadLibrary(
string
lpLibFileName);
[DllImport(" kernel32.dll ")]
public
extern
static
int
LoadLibraryEx(
string
lpLibFileName,
int
hFile,
int
dwFlags);
[DllImport(" kernel32.dll ")]
public
extern
static
bool
FreeLibrary(
int
hLibModule);
[DllImport(" kernel32.dll ", CharSet = CharSet.Ansi)]
public
extern
static
int
GetProcAddress(
int
hModule,
string
lpProcName);
[DllImport(" Invoke.dll ", CharSet = CharSet.Unicode)]
public
extern
static
void
InvokeFastCallFunc(
int
funcptr, Int32 ecx, Int32 edx);
[DllImport(" Invoke.dll ", CharSet = CharSet.Unicode)]
public
extern
static
void
InvokeStdCallFunc(
int
funcptr);
}
在winform下使用hmod = DLLInvoke.LoadLibrary("ZephyrNet21.dll");加载"ZephyrNet21.dll"一点问题没有可是在webform下hmod一直为0显然是没有成功加载dll。
初步判断是路径问题找不到dll 于是稍作修改
if (
string
.IsNullOrEmpty(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath))
hmod = DLLInvoke.LoadLibrary(" ZephyrNet21.dll ");
else
hmod = DLLInvoke.LoadLibrary(
System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath, " ZephyrNet21.dll ")
);
修改后有时能够加载有时又不能加载dll,当待加载的不依赖其他dll或只依赖系统路径下的dll则能够加载成功,那些还依赖其他dll的则不能加载成功
估计是dll搜索路径的问题,搜索了系统路径没有搜索待加载dll所在的路径。
再修改:
if (
string
.IsNullOrEmpty(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath))
hmod = DLLInvoke.LoadLibrary(" ZephyrNet21.dll ");
else
hmod = DLLInvoke. LoadLibraryEx (
System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath, " ZephyrNet21.dll "),
0,
8 //LOAD_WITH_ALTERED_SEARCH_PATH
);
修改后能够成功加载dll了。
以上是在.net 2.0测试的。听说在.net 3.5下LoadLibrary已经不存在这个问题,但我没有试过。
LoadLibraryEx
:
Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
返回值
Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
hFile Long,未用,设为零
dwFlags Long,指定下述常数的一个或多个
DONT_RESOLVE_DLL_REFERENCES:不对DLL进行初始化,仅用于NT
LOAD_LIBRARY_AS_DATAFILE:不准备DLL执行。如装载一个DLL只是为了访问它的资源,就可以改善一部分性能
LOAD_WITH_ALTERED_SEARCH_PATH:指定搜索的路径
注解
一旦不需要,用FreeLibrary函数释放DLL
/// 调用非托管dll
/// </summary>
class
{
[DllImport(" kernel32.dll
public
[DllImport(" kernel32.dll
public
[DllImport(" kernel32.dll
public
[DllImport(" kernel32.dll
public
[DllImport(" Invoke.dll
public
[DllImport(" Invoke.dll
public
}
在winform下使用hmod = DLLInvoke.LoadLibrary("ZephyrNet21.dll");加载"ZephyrNet21.dll"一点问题没有可是在webform下hmod一直为0显然是没有成功加载dll。
初步判断是路径问题找不到dll 于是稍作修改
if
hmod = DLLInvoke.LoadLibrary(" ZephyrNet21.dll
else
hmod = DLLInvoke.LoadLibrary(
System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath, " ZephyrNet21.dll
);
修改后有时能够加载有时又不能加载dll,当待加载的不依赖其他dll或只依赖系统路径下的dll则能够加载成功,那些还依赖其他dll的则不能加载成功
估计是dll搜索路径的问题,搜索了系统路径没有搜索待加载dll所在的路径。
再修改:
if
hmod = DLLInvoke.LoadLibrary(" ZephyrNet21.dll
else
hmod = DLLInvoke. LoadLibraryEx
System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.PrivateBinPath, " ZephyrNet21.dll
0,
8 //LOAD_WITH_ALTERED_SEARCH_PATH
);
修改后能够成功加载dll了。
以上是在.net 2.0测试的。听说在.net 3.5下LoadLibrary已经不存在这个问题,但我没有试过。
Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
返回值
Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpLibFileName String,指定要载入的动态链接库的名称。采用与CreateProcess函数的lpCommandLine参数指定的同样的搜索顺序
hFile Long,未用,设为零
dwFlags Long,指定下述常数的一个或多个
DONT_RESOLVE_DLL_REFERENCES:不对DLL进行初始化,仅用于NT
LOAD_LIBRARY_AS_DATAFILE:不准备DLL执行。如装载一个DLL只是为了访问它的资源,就可以改善一部分性能
LOAD_WITH_ALTERED_SEARCH_PATH:指定搜索的路径
注解
一旦不需要,用FreeLibrary函数释放DLL