Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从32位版本迁移到64位版本_C#_64 Bit - Fatal编程技术网

C# 从32位版本迁移到64位版本

C# 从32位版本迁移到64位版本,c#,64-bit,C#,64 Bit,我们在64位机器上测试时一直在进行32位构建。为了将机器的强大功能用于我们的应用程序,我们计划为C#/.NET 4.0代码库进行64位构建。我们过去从未做过,也没有测试过,虽然看起来很简单,但我们希望了解以下几点: 在此迁移过程中,我们需要采取哪些必要步骤 在此迁移过程中,我们可能会遇到哪些问题(如果有的话)?坦率地说,我不确定我们可能会遇到什么问题?比如我们的代码引用了32位版本的底层DLL?我们需要更新所有参考资料吗?同样,我们在这里没有太多的洞察力,所以这个具体的问题可能是无关紧要的。但

我们在64位机器上测试时一直在进行32位构建。为了将机器的强大功能用于我们的应用程序,我们计划为C#/.NET 4.0代码库进行64位构建。我们过去从未做过,也没有测试过,虽然看起来很简单,但我们希望了解以下几点:

  • 在此迁移过程中,我们需要采取哪些必要步骤
  • 在此迁移过程中,我们可能会遇到哪些问题(如果有的话)?坦率地说,我不确定我们可能会遇到什么问题?比如我们的代码引用了32位版本的底层DLL?我们需要更新所有参考资料吗?同样,我们在这里没有太多的洞察力,所以这个具体的问题可能是无关紧要的。但我们希望了解可能阻碍顺利过渡的任何问题
  • 我们在32位上进行了所有的功能测试。我们可能没有太多的时间在64位上执行严格的测试?依靠我们的32位功能测试是安全的策略吗

如果您只使用安全的托管代码,而不使用第三方DLL,那么您应该期待一个足够简单的迁移


不过,您确实希望测试所有内容,因为一旦产品发生如此重大的变化,测试它通常是一个好主意。您可能会发现一些在64位上失败的非常奇怪的事件。

如果您只使用安全托管代码,而不使用第三方DLL,那么您应该期待一个足够简单的迁移

不过,您确实希望测试所有内容,因为一旦产品发生如此重大的变化,测试它通常是一个好主意。您可能会发现一些在64位上失败的非常奇怪的事件。

在简单的情况下,将C代码从32位移动到64位只是更改构建设置的问题。安全C#代码在64位体系结构上的执行方式与在32位体系结构上的执行方式相同

实际上,您可能会遇到几个问题。以下是一些需要注意的问题:

  • 您的C#代码是否包含不安全代码?

    不安全的代码可以操纵指针,因此它可能以假定32位指针的方式编写。要了解项目是否包含不安全代码,可以在代码库中搜索“unsafe”关键字

  • 您正在使用p/Invoke吗?

    如果使用p/Invoke调用本机代码,CLR运行时现在将查找64位DLL,而不是32位DLL。如果在运行时未找到64位DLL,则会出现异常(“BadImageFormatException”或类似的情况)

    您可以在代码库中搜索“DllImport”,以查看是否正在使用p/Invoke

  • 您的项目是否包含脆弱的代码?

    将项目移动到64位后,将使用不同版本的即时(JIT)编译器。与X86 JIT编译器相比,X64 JIT编译器执行一些更积极的优化。因此,一些在X86中工作的错误编写(通常是多线程)代码可能最终在X64上崩溃

  • 您是否在使用封送、序列化和COM互操作等特定功能?

    在64位版本中,可能需要修改所有这些功能的用法。要在代码中搜索的一些关键字包括“封送”、“StructLayout”、“FieldOffset”、“BinaryFormatter”和“Com”

另请参阅本白皮书,该白皮书进一步讨论了如何将32位托管代码迁移到64位:

在简单的情况下,将C代码从32位迁移到64位只需更改生成设置即可。安全C#代码在64位体系结构上的执行方式与在32位体系结构上的执行方式相同

实际上,您可能会遇到几个问题。以下是一些需要注意的问题:

  • 您的C#代码是否包含不安全代码?

    不安全的代码可以操纵指针,因此它可能以假定32位指针的方式编写。要了解项目是否包含不安全代码,可以在代码库中搜索“unsafe”关键字

  • 您正在使用p/Invoke吗?

    如果使用p/Invoke调用本机代码,CLR运行时现在将查找64位DLL,而不是32位DLL。如果在运行时未找到64位DLL,则会出现异常(“BadImageFormatException”或类似的情况)

    您可以在代码库中搜索“DllImport”,以查看是否正在使用p/Invoke

  • 您的项目是否包含脆弱的代码?

    将项目移动到64位后,将使用不同版本的即时(JIT)编译器。与X86 JIT编译器相比,X64 JIT编译器执行一些更积极的优化。因此,一些在X86中工作的错误编写(通常是多线程)代码可能最终在X64上崩溃

  • 您是否在使用封送、序列化和COM互操作等特定功能?

    在64位版本中,可能需要修改所有这些功能的用法。要在代码中搜索的一些关键字包括“封送”、“StructLayout”、“FieldOffset”、“BinaryFormatter”和“Com”


另外,请参阅本白皮书,该白皮书进一步讨论了将32位托管代码迁移到64位:

是的,您需要确保您拥有所引用的所有DLL的64位版本。不,依靠32位测试是绝对不安全的!(你已经知道了,对吧?)

几年前,我们将系统移植到64位,并对以下几点感到惊讶:

  • 总的来说,这个港口比我们预想的要容易得多
  • 最困难的问题出现在最奇怪的地方,我们原以为会很简单的地方
  • 后续的构建是无故障的
一些意外和棘手问题的例子

我们的系统包括一个VisualStudio项目向导。Visual Studio仅为32位,但我们的客户可能会