asp.net下LoadLibrary加载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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值