仅当Assembly具有特定版本(x86或x64)时才编译语句

时间:2013-06-11 19:25:15

标签: c# compilation x86-64

我有一个项目,我引用third party assembly

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


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

Targeting both 32bit and 64bit with Visual Studio in same solution/project


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

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

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

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


如果我在IdToObject(ID.ToInt32())版本中试用x64,我会收到overflow at runtime

如果我在IdToObject(ID.ToInt64())版本x86中尝试doesn't compile(尝试将long作为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则避免编译另一行。我该怎么办?

1 个答案:

答案 0 :(得分:1)

看起来您需要使用预处理程序指令。在64位构建配置的项目属性中,在Build,Conditional compilation symbols下添加WIN64。然后将您的代码更改为:

#if WIN64
        return Document.IdToObject(ObjectID.ToInt64()); //returns an object
#else
        return Document.IdToObject(ObjectID.ToInt32()); //returns an object
#endif