gpt4 book ai didi

c# - 基于 32 位或 64 位的不同结构属性

转载 作者:太空狗 更新时间:2023-10-29 20:21:13 25 4
gpt4 key购买 nike

有没有一种方法可以有条件地将属性应用于结构?

如果机器是32bit我要应用这个属性

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]

如果机器是64位我想应用这个属性

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]

或者我可以替换属性中的值...

32 位(包 = 2)

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]

64 位(包 = 8)

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)]

我尝试使用这个 example但它适用于自定义属性,而不是现有属性。

更新:

  • 我想加入“任何 CPU”
  • 该属性用于 SHFILEOPSTRUCT并根据处理器使用或。
  • 我不想编译两个版本。

最佳答案

好问题。

我首先想到的答案是预处理器指令和 32 位和 64 位编译程序集。您可以使用相同的代码,甚至是相同的项目,只需根据目标系统以两种方式构建和部署它:

#ifdef Bit32
[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Unicode)]
#endif
#ifdef Bit64
[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Unicode)]
#endif

这需要根据目标架构为您的项目定义 Bit32 和 Bit64 编译常量,并且可能需要构建您的应用程序两次。

如果您想在运行时执行此操作,我认为这是不可能的,除非您在运行时动态发出整个类。属性可能只有常量数据,它们不能在运行时有条件地应用(预处理器指令在编译时运行,而不是运行时)。

我能想到的唯一其他方法是将类定义复制到两个命名空间,并根据 Environment.Is64BitOperatingSystem 属性有条件地使用一个或另一个。您可以使用此属性有条件地控制您实例化哪个类,或者您选择哪种创建策略(使用哪种工厂方法或相关模式),但您不能在运行时有条件地控制属性;它们的信息作为元数据静态编译到程序集 list 中。运行时本身特别使用这个来定义它如何将对象的成员存储为堆数据,并且您永远不会真正在用户代码中查找此属性并使用它来定义行为(因此忽略或指定条件包运行时的值)。

关于c# - 基于 32 位或 64 位的不同结构属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12410555/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com