.net2.0中调用非托管组件出现的问题及其解决方案.
2006-04-27 17:28
381 查看
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了,希望微软能针对这个问题尽快推出补丁.
在今天写的另一篇文章 .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了,希望微软能针对这个问题尽快推出补丁.
相关文章推荐
- XML Web Service并发异步调用的问题及其解决方案
- 新导入的工程出现乱码问题 及其 R文件没有生成 解决方案.
- asp.net调用com组件出现的问题
- XML Web Service并发异步调用的问题及其解决方案
- asp.net调用word的过程中出现的问题及其解决方法
- [解决]VS2010尝试设置 IDE 的进程内编译器的“References”参数时出现问题。对 COM 组件的调用
- 关于VS2013连接Oracle数据库提示:“尝试加载oracle客户端时引发badimage,如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题”的解决方案。
- cmd路径包含空格时易出现的问题及其解决方案
- 关于调用系统API 提示PInvoke 签名与非托管的目标签名不匹配问题的解决方案
- VS2005中,软件集成中“堆释放错误”的解决方案,调用自己dll可能会出现的问题!!!
- Android中jar包封装及调用中出现的问题及解决方案
- “希望可以帮到你”“尝试加载Oracle客户端库时引发BadImageFormatException。如果在安装32位Oracle客户端组件的情况下以64位模式运行,将出现此问题。”解决方案
- 最近在ArcGIS Engine开发中关于调用gp工具过程出现COM 组件的调用返回了错误 HRESULT E_FAIL 错误的解决方法 和 学习oracle中遇到的一些问题总结
- 避免在MFC程序中调用进程外Com组件出现“由于另一个程序正在运行...”的解决方案
- asp 调用com+组件发送出现问题
- Android中jar包封装及调用中出现的问题及解决方案
- 记录一下在加载COME组件,在C# WPF中调用组件出现的问题
- Android中jar包封装及调用中出现的问题及解决方案
- 微雪K9F1G08U0E NAND Flash模块读数据的时候出现部分字节漏读的问题及其解决方案
- C# Mobile远程调用WebService时,返回DataTable出现隐式转换出问题的解决方案