5

我无法让Visual Studio像我期望的那样运行。我创建了2个配置文件。一个具有定义的符号FOO,另一个具有定义的符号BAR。我有这样的代码:未定义条件编译符号

static class MyClass{ 
#if FOO 
    public static string const MyData="foo defined"; 
#endif 
#if BAR /*yes, I know #elif would work here too.. just trying to be simple*/ 
    public static string const MyData="bar defined"; 
#endif 
} 

,然后在另一个文件后,我有

if(MyClass.MyData=="foo defined")..... 

嗯,在我的申请,我得到MyClass.MyData没有定义的错误。另外,如果我在FOO配置文件中输入它,然后在#if FOO之后键入#error test之类的东西,那么它会产生一个构建错误,但是如果我删除它,它将会构建得很好,当我去运行它时,会得到一个编译错误,MyClass不包含MyData的定义。此外,这是一个ASP.Net Web应用程序。

有人可以帮我弄清楚如何使用条件编译?它的行为就好像Visual Studio使用编译符号正确编译它,但是每当ASP.Net Web服务器执行它时,它都会重新编译它,而没有任何符号...但是,这只是没有任何意义,它为什么会这么做。

编辑: 如果我使用FOO或BAR配置文件,它们都没有关系,它们都不像他们应该那样定义MyData符号。

EDIT2:

好的,这对于复制很重要! 在您的解决方案中创建一个新的App_Code文件夹,然后在其中添加一个.cs文件,然后向其中添加MyClass。这将重现在空白项目中工作的错误。其实我已经简化了下来,为普通的.cs文件只是

#if !(FOO || BAR) 
    #error neither foo or bar defined 
#endif 

这似乎是Visual Studio中不设置条件编译符号App_Code文件内

+0

我彻底改变了我的答案...检查出来。 – 2009-12-30 19:05:24

回答

5

因为ASP.NET编译你的开发之外的代码环境,它使用自己的构建配置。您必须在您的web.config中设置条件编译符号,请参阅链接: Conditional Compilation in ASP.NET 2.0

+0

那就是我所做的。在FOO配置文件中,我添加了符号FOO,并为BAR配置文件添加了符号BAR – Earlz 2009-12-30 17:12:31

+0

奇怪的是,问题必须存在于其他位置,您确定实际上是在使用正确的配置进行构建吗? – 2009-12-30 17:14:30

+0

是的..就像我说的,它的构建没有抛出错误,但是当我运行asp.net网站时,它会加载一个编译错误页面 – Earlz 2009-12-30 17:17:51