1

我有一个项目,我在其中引用了third party assembly.

那个大会有x86 and x64 versions。我只能参考一个,因为第三方系统依赖于一个特定的工作。(取决于安装系统的机器)


到目前为止,我可以使用这个答案在一个项目中管理这两个版本。因此,我将配置管理器选项设置为 x86 或 x64,它知道要引用的版本。

在同一解决方案/项目中使用 Visual Studio 以 32 位和 64 位为目标


但后来我遇到了以下问题:需要使用该程序集中具有版本特定参数类型的方法。

x64版本具有IdToObject(long ID)x86 中不存在的方法。

x86版本具有IdToObject(int ID)x64 中不存在的方法。

ID 由同一第三方的另一个程序集提供(不是特定于版本的)。这个ObjectID类给了我ToInt32()ToInt64()方法。


如果我IdToObject(ID.ToInt32())在一个x64版本中尝试,我会得到一个overflow at runtime.

如果我IdToObject(ID.ToInt64())在一个x86版本中尝试,doesn't compile(试图通过 int 长)。

我已经尝试过了,在 x64 版本上运行良好,但在 x86 上无法编译。

if (System.Reflection.Assembly.GetExecutingAssembly().GetName().ProcessorArchitecture == System.Reflection.ProcessorArchitecture.X86)
    return Document.IdToObject(ObjectID.ToInt32()); //returns an object
else
    return Document.IdToObject(ObjectID.ToInt64()); //returns an object

所以,我所需要的就是避免在项目设置为 x86 时编译单行,如果项目设置为 x64,则避免编译另一行。我能做些什么?

4

1 回答 1

1

看起来您将需要使用预处理器指令。在 64 位构建配置的项目属性中,在构建、条件编译符号下添加 WIN64。然后将您的代码更改为:

#if WIN64
        return Document.IdToObject(ObjectID.ToInt64()); //returns an object
#else
        return Document.IdToObject(ObjectID.ToInt32()); //returns an object
#endif
于 2013-06-11T19:41:12.097 回答