java64位调用32位dlll和64位dll都报错

Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Visual Studio中根据系统区分引用64位、32位DLL动态库文件的配置方法,本文在VS2008中测试通过,其它VS版本可以参考下
原来使用Win7的32位系统,进行C#工程的开发,后来重装系统,换成了win7的64位系统
调试原来的工程,由于在其中引用了“SQLite”的32位的dll,导致在64为位下程序无法运行(但是编译可以通过)
后来通过修改工程文件(.csproj),在其中设置引用的条件,解决了问题
打开引用了SQLite的工程(例如叫做info)的工程文件(info.csproj),找到对SQLite引用的语句,类似如下的代码
&Reference Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86"&
&SpecificVersion&False&/SpecificVersion&
&HintPath&..\..\libs\SQLite\System.Data.SQLite.dll&/HintPath&
&/Reference&
这里指定了引用的库的名称,路径等信息,将上面的配置内容,修改如下
&Reference Condition=" '$(Platform)' == 'AnyCPU' " Include="System.Data.SQLite, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=x86"&
&SpecificVersion&False&/SpecificVersion&
&HintPath&..\..\libs\SQLite\System.Data.SQLite.dll&/HintPath&
&/Reference&
只是增加了一个Condition的限制条件,表示只在平台类型位AnyCPU的时候,按照这个路径引用dll
复制上面的配置内容,并按照如下进行修改,设置在x64平台的生成时引用的dll路径
代码如下:&Reference Condition=" '$(Platform)' == 'x64' " Include="System.Data.SQLite.x64, Version=1.0.65.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139, processorArchitecture=AMD64"&
&SpecificVersion&False&/SpecificVersion&
&HintPath&..\..\libs\SQLite\System.Data.SQLite.x64.dll&/HintPath&
&/Reference&
最后,说一下怎样在VS中设置不同的生成平台
在工具栏的“解决方案平台”(一般这里会显示着“Any CPU”)下拉框中选择“配置管理器”,在其中添加想要的平台类型(一般就在x64,x86,Itanium中选择,不要修改默认名称)
然后在窗口下部的“项目上下文中”,在对应的项目(这里仅info项目,其他的保持AnyCPU不变)中修改平台类型(修改为X64)
然后,配置到这里,可能在项目文件中,对应新增的平台类型的一些设置不完整(我遇到编译的时候提示“OutputPath没有设置”),这个时候,进入vs的项目属性界面,稍微修改一下(改成别的,保存,再改回来)这些设置
ok,这个时候,应该就可以根据平台的类型不同,引用到对应的dll了,
在网上找到的资料说,这种方法对于msi的安装程序的制作不太好使,我不太清楚,涉及到这方面的同学,再仔细查查看。
不过,我这里提供一个可行的解决方案,那就是不要将整个项目制作到安装程序中,只是制作一个最基本的安装程序,然后通过升级来保证最新。
如果是在没有网络的环境中,那也可以将编译产出单独解压到安装目录下,以避免将整个解决方案制作成安装包。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具本帖子已过去太久远了,不再提供回复功能。一种64位进程调用32位DLL的方法
A Method of 64-bit Process Calling 32-bit DLL
64位进程不能加载32位dll是程序或平台移植中需要解决的一个难题.比较了32位和64位体系结构的区别,分析了64位进程不能加载32位dll的原因.研究了进程外COM服务器组件的内部机制,给出了64位进程访问32位进程外COM组件的调用模型.设计并实现了32位的进程外COM服务器.在COM组件类中封装对32位dll的访问接口,64位进程通过调用在32位进程外COM服务器中注册的COM组件类中的接口,间接地访问32位dll的相关接口功能.方法设计时采用单态模式和垃圾回收机制,线程安全,性能稳定.
Abstract:
The 64-bit process cannot load 32-bit dll is a difficult problem to solve in program or platform transplantation. It gives a com-parison of 32-bit and 64-bit system structure,and analyzes the reason that the 64-bit process cannot load 32-bit dll. Study the internal mechanism of out-of-process COM,give a call model about 64-bit process to access 32-bit process COM. Design and implement 32-bit COM server,and the COM component class encapsulates 32-bit dll API. 64-bit process calls 32-bit COM component class interface reg-istered in the process COM server,and indirectly accesses 32-bit dll API. Using singleton mode and garbage collection mechanism,the COM server works stably,and is safe in thread.
西安工业大学 计算机科学与工程学院,陕西 西安710032
年,卷(期)
Keywords:
机标分类号
本文读者也读过
加载中,请稍候
.客服电话
&&8:00-11:30,13:00-17:00(工作日)64位VC程序,能否调用32位的dll
最近用JNI封装一个windows上的Java接口,算法部提供的是一个用VC6.0编译的32位的lib和dll。先是封装了一个32位的dll,供Java调用,发现只能在32位的JVM上加载,不能在63位的JVM上加载,所以现在要封装一个64位的dll,想在64位的JVM上加载。
64位VC程序,能否调用32位的dll?
我启动x64模式的VC2010,建立一个VC工程。但是我要调用的dll只有32位的。VC6.0只能编译32位的dll,无法编译64位的dll,所以得安装VS2008以上的版本。
可以做到正确的调用么?
------解决方案--------------------
不能,编址规范不一样。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。64位进程调用32位dll的解决方法-CSDN论坛
64位进程调用32位dll的解决方法
有两篇文章比较靠谱。不过不知道具体方法。
/mazhenyu/archive//798710.html
创建一个进程外COM(EXE类型),内部链接dll,不懂这个什么意思。
另外有说使用代理进程(dllhost.exe)也不懂如何实现。
有做过的人关注下。谢谢。
都不是64bit进程直接加载,而是等于再包装一个32bit的exe来加载32bit的DLL,然后64bit的进程跟32bit的进程通信来变相调用32bit的dll
再包装一个32bit的exe?你的意思是说64bit的程序通过路径的方式去program(x86)目录下去调出这个程序?但是这个时候32bit的exe是被wow64子系统托管着。不会有什么问题吗。我试试看。谢谢提点
路过&好好学习
W64,一个怪胎。
引用&2&楼&lzjdlsl&的回复:再包装一个32bit的exe?你的意思是说64bit的程序通过路径的方式去program(x86)目录下去调出这个程序?但是这个时候32bit的exe是被wow64子系统托管着。不会有什么问题吗。我试试看。谢谢提点
通过进程通信,socket,消息等,wow64等无所谓..也一样可以通信交换数据等
&windows64位编程白皮书里面已经明确讲了,win64与win32在用户层是严格隔离开的,win32应用程序不可以访问win64的内存,win64也不能读取win32的内存。
它们之间可以使用系统提供的通信办法来交换数据。
引用&8&楼&lisunlin0&的回复:windows64位编程白皮书里面已经明确讲了,win64与win32在用户层是严格隔离开的,win32应用程序不可以访问win64的内存,win64也不能读取win32的内存。
它们之间可以使用系统提供的通信办法来交换数据。
恩。那楼上的可以具体点吗。它们之间可以使用系统提供的通信办法来交换数据。
我建立一个32位的进程调用dll。然后通过64的进程和这个exe通信。比如我想调用哪一个函数就发一个消息。32位的exe接收到消息后就去调用相应的函数。然后通过消息的方式再发还给64位的exe。不过这里面有个同步的问题。也就是我我必须等待会影响我的性能和稳定性。
上面提到的创建一个进程外COM的方式。实在不明白是什么意思。不知道还有人可以给我讲讲进程外COM的方式不,谢谢
在博客园上看到一篇文章:
64位进程调用32位dll的解决方法
/mazhenyu/archive//798710.html
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe&/regserver&&(注销&*.exe&/unregserver)。
4.64位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。
具体步骤:
我首先创建了一个简单的dll工程,只输出一个函数int&c&=&add(int&a,int&b);&生成lib和dll
然后创建一个进程外COM(EXE类型),内部链接dll,添加方法Method:&Add(long&*c)
{&*c&=&add(1,2);}编译生成。
然后注册COM,*.exe&/regserver
最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!!!
本人有三个问题:
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?感谢大家的指教和浏览!!!如果您能够实现上面的具体步骤麻烦我我说一声哈,我的QQ:,Email:,不甚感激!
在博客园上看到一篇文章:
64位进程调用32位dll的解决方法
/mazhenyu/archive//798710.html
工作流程:
1.创建一个进程外COM服务器(EXE)。
2.将32位dll的接口函数封装为COM服务器的相关接口。
3.注册COM服务器*.exe&/regserver&&(注销&*.exe&/unregserver)。
4.64位进程调用32位COM服务器接口,成功。从而曲线实现了64位进程调用32位dll。
具体步骤:
我首先创建了一个简单的dll工程,只输出一个函数int&c&=&add(int&a,int&b);&生成lib和dll
然后创建一个进程外COM(EXE类型),内部链接dll,添加方法Method:&Add(long&*c)
{&*c&=&add(1,2);}编译生成。
然后注册COM,*.exe&/regserver
最创建一个64位WIN32工程验证64位环境下方法调用是否正确,经验证正确!!!
本人有三个问题:
1、创建的进程外服务器是用MFC下的还是使用ATL创建?
2、这里的“内部链接dll”是什么意思?怎么样连接呢?
3、注册完COM服务器,是不是就可以在64位下直接调用32的dll而不用调用COM服务器的相关接口呢?感谢大家的指教和浏览!!!如果您能够实现上面的具体步骤麻烦我我说一声哈,我的QQ:,Email:,不甚感激!
回复

我要回帖

更多关于 32位exe调用64位dll 的文章

 

随机推荐