如何在64位系统加载32位DLL程序集

jnhcd 2011-04-02 01:59:44
最近在公司做了个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

等等,试过了都不行,求助各位大大!!!
...全文
11322 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
寒山-居士 2013-09-09
  • 打赏
  • 举报
回复
大神们 有交流群么?
lonkong 2012-11-07
  • 打赏
  • 举报
回复
有没有办法,不改Any CPU,调用32位的dll
NosaLee 2011-06-09
  • 打赏
  • 举报
回复
今天我也遇到同样的问题。

除非万不得已,我不会将 Any CPU 改为 x86,我还是想释出 x86 & x64 自适应的版本(因为我做的是共享软件,好多人有这种嗜好——我用 64 位 CPU、64 位 OS,我就要用 64 位应用才爽)

目前有个解决方案(尚未测试):
假设引用 DLL 为 a.dll,我打算在程序目录下放置 a.x86.dll 及 a.x64.dll,程序启动时,立即判断 OS 位数,32 位则将 a.x86.dll 复制一份,命名为 a.dll;64 位同理。

这样,保证程序运行正常的同时又得到一个 x86 & x64 自适应版本,对共享软件来说,是不错的思路。

不过,还没测试,呆会测一下看看。

jnhcd 2011-04-06
  • 打赏
  • 举报
回复
ok,解决了,编译时目标平台由 any CPU 改为 x86 的确可以。之前是我自己搞错了,我只是把需要调用那个dll的工程改成x86了,其他的还是any CPU,因为我做了个系统的service,只改引用dll的工程以后,service用不了,呵呵,终于发现了。

结贴!
缪军 2011-04-05
  • 打赏
  • 举报
回复
楼主,你那个文件名不带命名空间的吧,我想应该这样才是吧:
regsvr32 C:\Windows\SysWOW64\SQLite.dll
阳明 to life 2011-04-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 jnhcd 的回复:]
to 18L
在64位机器上是能运行ActiveX插件,可是我这个插件还是用了别的dll程序,这个程序及分32位和64位的
[/Quote]
是这样啊,那么你需要调用的dll本来就不是能够注册的com控件,当然注册失败,你需要做的是在ActiveX控件工程中用dllimorpt或者对应的调用dll方法调用就行了,根本就不需要注册,你先用一个命令行工程测试一下
gtyubhg2011 2011-04-05
  • 打赏
  • 举报
回复
路过帮忙顶
jnhcd 2011-04-05
  • 打赏
  • 举报
回复
to 20L
等上班了再去试试这个。。。

to 21L
文件名就已经带了命名空间的,其实regsvr32后面的整个就是文件名
永远专注NET 2011-04-04
  • 打赏
  • 举报
回复
在编译时目标平台由 any CPU 改为 x86,

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

我已用这种方法解决我的类似的问题。
可能是你配置的不对吧。
请再确认一下这个方法。
阳明 to life 2011-04-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 crackdung 的回复:]

有可能嗎?
[/Quote]
呵呵,这个我在64位机子上用过32位的ActiveX,不过楼主的不知道什么情况
crackdung 2011-04-04
  • 打赏
  • 举报
回复
有可能嗎?
jnhcd 2011-04-04
  • 打赏
  • 举报
回复
to 16L
我也想动态加载的,可是把64位的dll放到setup里面都不能编译通过,这样只能手动放到安装目录下,这样的话我都不要动态加载了

to 18L
在64位机器上是能运行ActiveX插件,可是我这个插件还是用了别的dll程序,这个程序及分32位和64位的
liaofenglove 2011-04-04
  • 打赏
  • 举报
回复
你同时加载两个程序集,针对32和64的系统,然后再加载的时候判断一下目标机器的位数再选择相应的程序集就可以了。哈哈
崔作非 2011-04-04
  • 打赏
  • 举报
回复
可以,我用过几次用来解决此类问题。
jnhcd 2011-04-04
  • 打赏
  • 举报
回复
我怎么感觉转成x86不能解决啊,我也试过了,难道我搞错了?
jnhcd 2011-04-03
  • 打赏
  • 举报
回复
求救啊,这个不解决不行啊
dusenyao 2011-04-03
  • 打赏
  • 举报
回复
“1.在编译时目标平台由 any CPU 改为 x86”

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

2.用Xenobuild或者Smartassembly 之类吧Dependency Merge到一个.exe文件里面去
崔作非 2011-04-03
  • 打赏
  • 举报
回复
64位的程序永远不能调用32位的dll,这是windows的安全机制,反之也一样。
对于.net程序有另一个解决办法,就是把64位的转换成32位的,实际上是any cpu的转成x86的。
详见我的博客http://blog.sina.com.cn/s/blog_4d2694ae0100nr97.html,这里有具体的使用方法。
jnhcd 2011-04-02
  • 打赏
  • 举报
回复
现在是ActiveX控件是没问题的,在32位机器上OK,在64位机器上加载错误,
手动换个64位的dll就可以了,我现在想让64位系统可以加载32位的dll,大家明白了没有啊?
阳明 to life 2011-04-02
  • 打赏
  • 举报
回复
你实在不行可以去下个capicom试试 这个是微软的COM控件 是32位的,注册之后你用32位IE判断下<object>的对象是不是为Null 不为Null的话就说明注册成功
当然,你如果觉得你的ActiveX控件没有问题,是64位机子的问题,你可以拿到32位机子去试下就知道了
加载更多回复(5)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧