2013-06-11 47 views
1

我有一个项目,其中我引用了third party assembly仅在Assembly有特定版本(x86或x64)时编译语句

该组件有x86 and x64 versions。我只能参考一个,因为第三方系统依靠特定的工作。 (取决于哪台机器安装了系统)


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

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


但后来我想出了以下的问题:需要使用的方法,由具有特定版本的参数类型的组合。

x64版本有一个IdToObject(long ID)方法,在x86中不存在。

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

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


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

如果我尝试在x86版本中尝试IdToObject(ID.ToInt64())版本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,则需要另一行。我能做什么?

+0

听起来像您可能不得不求助于使用预处理器指令?可能有另一种方式,但我不知道它会是什么。 http://msdn.microsoft.com/en-us/library/ed8yd1ha(v=vs.100).aspx –

回答

1

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

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

该符号可以是任何你想要的。如果您希望将符号添加到32位版本配置中,请随意将其反转。 –