ASP.NET中调用非托管DLL的问题

我用的是VS2005的开发环境,后来发现使用[DllImport("bxllib.dll")]后提示 无法加载 DLL “bxllib.dll” 找不到指定的模块!我这时就把bxllib.dll拷贝到Bin目录下,但仍然提示找不到DLL,在工程里添加DLL引用的时候,发现添加这个非托管DLL就会令VS2005异常退出
后来发现用[DllImport(@"./Bin/bxllib.dll")]这样指定DLL的绝对路径就可以正常装载。
我们用的是虚拟空间
DllImport里面只能用字符串常量,而不能够用Server.MapPath(@"~/Bin/bxllib.dll")来确定物理路径。

有没有好的方法,求求大家帮帮忙,我也找了个资料,但是不知道怎么操作。。。。
高手们,帮忙解决下。。。很急呀。。。

DllImport会按照顺序自动去寻找的地方: 
1、exe所在目录 
2、System32目录 
3、环境变量目录
所以只需要你把引用的DLL 拷贝到这三个目录下 就可以不用写路径了 或者可以这样server.MapPath(./bin/*.dll)
web中的,同时也是应用程序中的
后来发现用[DllImport(@"C:/OJ/Bin/Judge.dll")]这样指定DLL的绝对路径就可以正常装载。
这个问题最常出现在使用第三方非托管DLL组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下:
首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理
会比较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什
么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了.
具体做法如下:
首先我们在服务器上随便找个地方新建一个目录,假如为C:/DLL
然后,在环境变量中,给Path变量添加这个目录
最后,把所有的非托管文件都拷贝到C:/DLL中.
或者更干脆的把DLL放到system32目录
对于可以自己部署的应用程序,这样未偿不是一个解决办法,然而,如果我们用的是虚拟空间,我们是没办法把注册PATH变量或者把我们自己的DLL拷到system32目录的。同时我们也不一定知道我们的Dll的物理路径。
DllImport里面只能用字符串常量,而不能够用Server.MapPath(@"~/Bin/Judge.dll")来确定物理路径。
ASP.NET中要使用DllImport的,必须在先“using System.Runtime.InteropServices;”
不过,我发现,调用这种"非托管Dll”相当的慢,可能是因为我的方法需要远程验证吧,但是实在是太慢了。
经过一翻研究,终于想到了一个完美的解决办法
1. 把dll拷贝到bin目录下,然后发布网站调用是可以的,因为发布后的网站DLL都在bin目录下与dll同级所以是可以的。
2.把dll拷贝到bin目录下,直接在vs2005里面调试是不行的,因为调试网站是在vs自带的Web服务器里面运行的,利用的文件是.../Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files这个目录下的临时文件来运行的,但这里没有DLL所以调试是达不到效果的。但是把dll文件放在windows/system32目录下,然后直接在vs2005里面调试是可以的。
3.如果给网站加个解决方案(*.sln),保持dll和这个sln文件在同一级目录下,在vs2005调试是可以的,但发布后是不行的。
综上所述,建议:调试时将dll文件放在windows/system32目录下,发布时将dll文件放在bin目录下即可。

来源:nba直播

你可能感兴趣的:(ASP.NET中调用非托管DLL的问题)