asp.net下LoadLibrary加载dll的问题

解决ASP.NET中LoadLibrary加载DLL问题
本文探讨了在ASP.NET环境下使用LoadLibrary函数加载DLL时遇到的问题,特别是与路径相关的问题。通过修改代码来解决DLL加载失败的情况,并解释了LoadLibraryEx函数的使用及其参数,最终成功实现了DLL的加载。

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

在使用 `LoadLibrary` 加载 DLL 时,若出现报错,可能是由多种原因导致的。以下是一些常见的排查与解决方法: ### 1. 检查 DLL 文件路径是否正确 确保传入 `LoadLibrary` 的 DLL 文件路径是正确的,并且该文件确实存在于指定位置。如果路径错误或文件缺失,加载会失败。 ```cpp HMODULE hModule = LoadLibrary("example.dll"); if (hModule == NULL) { DWORD dwError = GetLastError(); printf("LoadLibrary failed with error %lu\n", dwError); } ``` ### 2. 使用绝对路径或相对路径明确 有时候相对路径可能导致找不到 DLL 文件。可以尝试使用绝对路径加载 DLL,以排除路径问题。 ```cpp HMODULE hModule = LoadLibrary("C:\\Path\\To\\Your\\example.dll"); ``` ### 3. 检查依赖项是否完整 DLL 文件可能依赖于其他 DLL 或系统组件。如果这些依赖项缺失或版本不兼容,会导致加载失败。可以使用工具如 [Dependency Walker](http://www.dependencywalker.com/) 来检查 DLL 的依赖关系。 ### 4. 查看错误码并处理 调用 `GetLastError()` 可获取具体的错误代码,根据错误代码可以更精准地定位问题[^2]。 ```cpp HMODULE hModule = LoadLibrary("example.dll"); if (!hModule) { DWORD errorCode = GetLastError(); // 根据errorCode进行具体处理 printf("Failed to load DLL, error code: %lu\n", errorCode); } ``` 常见错误码及其含义: - **ERROR_FILE_NOT_FOUND (2)**:指定的 DLL 文件未找到。 - **ERROR_PATH_NOT_FOUND (3)**:路径不存在。 - **ERROR_BAD_EXE_FORMAT (193)**:试图在 64 位进程中加载 32 位 DLL(或反之)。 - **ERROR_MOD_NOT_FOUND (126)**:找不到指定模块,通常表示依赖项缺失。 ### 5. 确保架构一致(32/64位) 确保你的应用程序与目标 DLL 的编译架构一致。例如,32 位程序不能加载 64 位 DLL,反之亦然。 ### 6. 验证 DLL 是否损坏 尝试使用一个简单的自定义 DLL(如仅包含一个整数加法函数)进行测试。如果自制的 DLL 可以正常加载,则说明原目标 DLL 文件可能存在损坏或结构问题[^1]。 ```cpp // 示例简单 DLL 函数导出 extern "C" __declspec(dllexport) int AddNumbers(int a, int b) { return a + b; } ``` ### 7. 检查安全权限和访问控制 确保当前运行的应用程序有权限访问该 DLL 文件。有时防病毒软件或系统策略可能会阻止 DLL加载。 ### 8. 使用 `LoadLibraryEx` 进行高级控制 `LoadLibraryEx` 提供了更多选项,例如从内存加载、绕过系统搜索路径等。 ```cpp HMODULE hModule = LoadLibraryEx("example.dll", NULL, LOAD_WITH_ALTERED_SEARCH_PATH); ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值