DOTNET 32位下的程序在64位下真的可以运行吗?
理论上,32位下编译过的DOTNET在64位下是可以运行的,因为虚拟机会帮你做转换。但,如果你编程的习惯不好,也有可能不能运行。
近来,在做64位开发,MAXTOCODE 要支持 64位平台和 Vista 嘛。发现一个问题,在32位环境下运行很正常的软件,在64位下运行却得不到正确的值。
如例:
[DllImport("KERNEL32.DLL", EntryPoint="GetModuleHandleA", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern int GetModuleHandle(string lpModuleName);
如果你的调用是 int m_handle = GetMethodHandle("");
这样的语句绝对会在 64 位获取不到正确的值。
原因很简单, int 是 32 位的,而在 64位系统下,返回的地址是 00000000 00000000 的格式,系统会自动取基址,而抛弃了段址。
所以,以后老老实实,开发定义都这样写吧
[DllImport("KERNEL32.DLL", EntryPoint="GetModuleHandleA", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
而且要改掉用 int 的习惯。。。 别把以前 WINDOWS的开发习惯带进来,特别是咱们喜欢用 VB。NET 的朋友, LONG 也是 32 位的
近来,在做64位开发,MAXTOCODE 要支持 64位平台和 Vista 嘛。发现一个问题,在32位环境下运行很正常的软件,在64位下运行却得不到正确的值。
如例:
[DllImport("KERNEL32.DLL", EntryPoint="GetModuleHandleA", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern int GetModuleHandle(string lpModuleName);
如果你的调用是 int m_handle = GetMethodHandle("");
这样的语句绝对会在 64 位获取不到正确的值。
原因很简单, int 是 32 位的,而在 64位系统下,返回的地址是 00000000 00000000 的格式,系统会自动取基址,而抛弃了段址。
所以,以后老老实实,开发定义都这样写吧
[DllImport("KERNEL32.DLL", EntryPoint="GetModuleHandleA", CharSet=CharSet.Ansi, SetLastError=true, ExactSpelling=true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);
而且要改掉用 int 的习惯。。。 别把以前 WINDOWS的开发习惯带进来,特别是咱们喜欢用 VB。NET 的朋友, LONG 也是 32 位的