如何判断我的应用程序运行的JVM是32位还是64位?具体来说,我可以访问什么功能或偏好来在程序中检测到这个?
我在64位系统上调用32位非托管DLL的函数.我得到的是:
BadImageFormatException:尝试加载格式不正确的程序.(HRESULT异常:0x8007000B)
起初,我将我的项目设置为Any CPU平台,因此我将它们都更改为x86,但此错误仍在发生.这真的是我所知道的唯一解决方案.
DLL没有损坏或任何东西,因为我可以将它们与其他程序一起使用(我没有源代码).我想也许它没有找到依赖,但我检查了,他们都在那里.另外,DllNotFoundException
在这种情况下不会抛出一个吗?
我还可以做些什么?在您说"使用64位非托管DLL"之前,让我指出没有一个.;)
是否有可能编译项目在32位与cmake
和gcc
一对64位系统?它可能是,但我该怎么做?
当我尝试"无知"的方式,没有设置任何参数/标志/等,只是设置LD_LIBRARY_PATH
找到它中的链接库~/tools/lib
似乎忽略它,只查看名为lib64的子目录.
Java代码是否可以在32位JDK中构建和编译成32位字节代码,在64位JVM中工作?或者64位JVM是否需要64位字节代码?
为了提供更多细节,我的代码在运行32位JVM的Solaris环境中工作,但现在我在将JDK和Weblogic Server升级到64位后遇到问题.
我有为AnyCPU编译的ac#单元测试项目.我们的构建服务器是64位机器,并安装了64位SQL Express实例.
测试项目使用类似于以下内容的代码来标识.MDF文件的路径:
private string GetExpressPath()
{
RegistryKey sqlServerKey = Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" );
string sqlExpressKeyName = (string) sqlServerKey.GetValue( "SQLEXPRESS" );
RegistryKey sqlInstanceSetupKey = sqlServerKey.OpenSubKey( sqlExpressKeyName + @"\Setup" );
return sqlInstanceSetupKey.GetValue( "SQLDataRoot" ).ToString();
}
Run Code Online (Sandbox Code Playgroud)
这段代码在我们的32位工作站上工作正常,并且在我最近使用NCover启用代码覆盖率分析之前,在构建服务器上工作正常.因为NCover使用32位COM组件,所以测试运行器(Gallio)作为32位进程运行.
检查注册表,下面没有"实例名称"键
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server
在32位模式下运行的应用程序是否有办法访问Wow6432Node外部的注册表?
我想我专注于x86,但我通常对从32位到64位的移动感兴趣.
从逻辑上讲,我可以看到常量和指针在某些情况下会更大,因此程序可能会更大.为了提高效率而在字边界上分配内存的愿望意味着分配之间会有更多的空白.
我还听说x86上的32位模式必须在上下文切换时刷新其缓存,因为可能存在重叠的4G地址空间.
那么,64位的真正好处是什么?
作为补充问题,128位会更好吗?
编辑:
我刚刚编写了我的第一个32/64位程序.它生成16字节(32b版本)或32字节(64b版本)对象的链接列表/树,并对stderr进行大量打印 - 不是一个非常有用的程序,而不是典型的,但它是我的第一个.
大小:81128(32b)v 83672(64b) - 所以差别不大
速度:17s(32b)v 24s(64b) - 在32位OS(OS-X 10.5.8)上运行
更新:
我注意到正在开发一种新的混合x32 ABI(应用程序二进制接口),它是64b但使用32b指针.对于某些测试,它导致比32b或64b更小的代码和更快的执行.
在x64位OS平台上运行PowerShell脚本时,如何在脚本中确定脚本运行的PowerShell(32位或64位)版本?
背景
默认情况下,32位和64位版本的PowerShell都安装在64位平台(如Windows Server 2008)上.这可能会导致运行必须针对特定体系结构的PowerShell脚本时遇到困难(即使用64-用于SharePoint 2010脚本的位,以便使用64位库).
相关问题:
我正在尝试将现有代码调整为64位机器.主要问题是在一个函数中,前一个编码器使用void*参数,该参数在函数本身中转换为合适的类型.一个简短的例子:
void function(MESSAGE_ID id, void* param)
{
if(id == FOO) {
int real_param = (int)param;
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
当然,在64位机器上,我收到错误:
error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)
我想纠正这个问题,以便它仍然可以在32位机器上运行并且尽可能干净.任何的想法 ?
如何判断我的应用程序(在Visual Studio 2008中作为任何CPU编译)是作为32位还是64位应用程序运行?
我认为问题是自我解释的,我想它可能与溢出有关,但我仍然不太明白.引擎盖下发生了什么?
为什么-(-2147483648) = -2147483648
(至少在用C编译时)?