VS2005的bug还是多...今天又被我找着一个.
在今天写的另一篇文章 .net组件调用VC组件时的数据类型问题. 中,我自己封装了一个.net组件,这个组件通过与一个在VC6下写的dll进行通信来方便的给.net程序提供服务,实际上,我写了一个控制台项目来进行测试,效果非常好,没有任何问题,于是把这个组件发布到公司内部使用,结果麻烦就来了…
一个同事来找我,告诉我那个组件不能使用,说是找不到指定的模块.我的第一反应是:肯定是漏拷了vc的运行库.
结果一看,是如下的一个出错提示:
提示上声称缺少的dll是个在VC6下编译生成的dll,也就是说,是非托管的.这里非常奇怪,因为我明明把所有的dll都放到了bin目录下,怎么会提示找不到dll呢?之间的引用本来就是通过相对路径引用的啊.很纳闷,回到自己机子上调试,直到这时我还在怀疑是不是VC6运行库的问题,新建一个web项目(同事就是web项目出错了),运行,嘿,果然出错了,看来真不是运行库的问题了,那问题是出在哪呢?引用的问题吗?但是非托管的dll是不能添加引用的.直觉告诉我,问题可能是在这.
开始google,呵,看来出这个问题的还不少,只不过都是国外的.点了forums.asp.net的一个帖子(http://forums.asp.net/thread/1121085.aspx)查看.看完之后茅塞顿开.
PS:这个问题只在web项目中可能出现,原因下面将解释.
这个问题最常出现在使用ThirdParty组件的时候,我的也同样是这时出的问题,Asp.Net Team的官方解决方案如下:
首先需要确认你引用了哪些组件,那些是托管的,哪些是非托管的.托管的很好办,直接被使用的需要引用,间接使用的需要拷贝到bin目录下.非托管的处理会比较麻烦.实际上,你拷贝到bin没有任何帮助,因为CLR会把文件拷贝到一个临时目录下,然后在那运行web,而CLR只会拷贝托管文件,这就是为什么我们明明把非托管的dll放在了bin下却依然提示不能加载模块了.
具体做法如下:
首先我们在服务器上随便找个地方新建一个目录,假如为C:\DLL
然后,在环境变量中,给Path变量添加这个目录
最后,把所有的非托管文件都拷贝到C:\DLL中.
OK,去运行吧,没问题了吧?(注意,运行之前,需要重启VS,如果使用IIS,那就需要重启IIS)
嗯,其实这并不是什么官方做法,实在是现在的情况下,只能如此处理而已,据说该bug已经被提交到CLR Team了,希望微软能针对这个问题尽快推出补丁.