Visual Studio #if 在不同版本的 Visual Studio 上的作用

3

我希望根据我所使用的Visual Studio版本编译不同的内容,类似于以下方式:

#if VISUAL_STUDIO_VERSION > 2015
eventH?.Invoke(this, EventArgs.Empty);
#else
if(eventH != null)
  eventH(this, EventArgs.Empty);
#endif

我该如何做到这一点?

我尝试过像这样的东西:

#if (_MSC_VER==1700)

根据这里的解决方案,但没有成功。

编辑

我需要在WPF应用程序中使用(显然)。

根据MSDN,C#中的#if仅限于布尔型。那么,是否有一种方法可以基于VS版本或类似的东西在项目属性中定义符号?

2个回答

1
你所提到的被称为 #define,是编译时常量。这些定义需要被... 定义(显然!!),如果未定义,则它们为空,因此表达式失败。你原始链接的示例是针对C++的,因此在C#中自然未定义。
在幕后,Visual Studio使用MSBuild来实际编译您的项目(然后MSBuild调用编译器)。您使用的Visual Studio版本不可用于MSBuild。即使尝试使用预构建宏也无效,因为它在MSBuild / TFSBuild上下文中执行,在那个时候Visual Studio不在上下文中。
我还应该指出,您已将Visual Studio版本与编译器版本混淆 - 编译器版本也没有本地可用的定义。
您最好的选择是创建和使用自定义的MSBuild / TFSBuild生成定义,然后将这些#defines设置为生成的参数,并且您还可以控制调用哪个编译器(虽然这太复杂了,无法在此作为答案显示)。您将有一个生成定义,以针对C#6编译器进行定位,并且另一个用于默认编译器。

-2

你应该创建一个新的配置。你可以给它一个自定义的名称。在构建或发布项目时,只需要选择该配置即可。然后你可以像使用#if Debug一样使用它。

例如:#if MyCustomConfiguration

以下链接可能会对你有所帮助:

VisualStudio上的自定义构建配置

如何创建和编辑配置


2
这根本没有区分VS版本。 - slugster
但是,实现所需结果的方法不一定总是回答问题。一个好的建议对用户也可能有作用。 - Ankush Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接