日期:2014-05-17  浏览次数:21361 次

如何在64位系统加载32位DLL程序集
最近在公司做了个ActiveX插件嵌在Web系统中,用到了SQLite数据库,
因为是在PC机开发,用的是32位的System.Data.SQLite.dll,
但是最近遇到问题了,在Windows 2008 Server中部署系统之后,
安装ActiveX插件之后,在使用SQLite时报错,诸如“加载失败”之类。
后来手动替换64位的System.Data.SQLite.dll后才暂时解决这个问题。

但是如果部署了系统之后,访问系统的有32位系统,有64位系统,如何解决这个问题啊?
安装ActiveX插件都是安装在本地的,64位系统就不能加载32位的程序集了。
如何在64位系统加载32位DLL程序集呢?

在此之前也网上查了好多资料,说了几种“解决方法”,
1.在编译时目标平台由 any CPU 改为 x86
2.将32位的System.Data.SQLite.dll复制到64位系统的C:\Windows\SysWOW64,
  然后在cmd中 regsvr32 System.Data.SQLite.dll

等等,试过了都不行,求助各位大大!!!

------解决方案--------------------
你实在不行可以去下个capicom试试 这个是微软的COM控件 是32位的,注册之后你用32位IE判断下<object>的对象是不是为Null 不为Null的话就说明注册成功 
当然,你如果觉得你的ActiveX控件没有问题,是64位机子的问题,你可以拿到32位机子去试下就知道了
------解决方案--------------------
64位的程序永远不能调用32位的dll,这是windows的安全机制,反之也一样。
对于.net程序有另一个解决办法,就是把64位的转换成32位的,实际上是any cpu的转成x86的。
详见我的博客http://blog.sina.com.cn/s/blog_4d2694ae0100nr97.html,这里有具体的使用方法。
------解决方案--------------------
“1.在编译时目标平台由 any CPU 改为 x86”

这个是有用的,如果你的程序用不到 64bit功能的话 (如果你用sqlite的话,估计用不到x64) 直接编译成 x86的Binary就行了

2.用Xenobuild或者Smartassembly 之类吧Dependency Merge到一个.exe文件里面去
------解决方案--------------------
可以,我用过几次用来解决此类问题。
------解决方案--------------------
该回复于2011-04-06 15:10:30被版主删除

------解决方案--------------------
    你同时加载两个程序集,针对32和64的系统,然后再加载的时候判断一下目标机器的位数再选择相应的程序集就可以了。哈哈
------解决方案--------------------
有可能嗎?
------解决方案--------------------
引用:
有可能嗎?

呵呵,这个我在64位机子上用过32位的ActiveX,不过楼主的不知道什么情况
------解决方案--------------------
在编译时目标平台由 any CPU 改为 x86,

用这个方法是可以的。
因为32位的可以在64位上运行。
  反之不可。

我已用这种方法解决我的类似的问题。