C#中值得信赖的旧预处理程序指令在我编写时看起来效果很好:
#if DEBUG
...
(Some code)
...
#endif
然而,条件块中包含的属性似乎继续得到处理,我得到错误,表明这样。例如,围绕条件块中的[AssemblyVersion(...)]
似乎没有任何影响。
我可以详细说明我们为什么要有条件地忽略[AssemblyVersion(..)],但它无关紧要。有什么想法吗?
答案 0 :(得分:8)
这适合我。在我的AssemblyInfo.cs文件中,我有以下内容:
#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
查看Reflector中编译的程序集,我看到了正确的属性。
您应该确保您的DEBUG符号仅在项目属性中定义,而不是在代码中的任何其他位置定义为实际的#define DEBUG指令。如果直接在代码中定义它,它将仅对该文件有效,而不是整个项目。在项目属性中定义它将导致它对整个项目有效。
答案 1 :(得分:1)
我明白了!我忽略了一条关键信息:它是一个工作流项目(Guid {14822709-B5A1-4724-98CA-57A101D1B079})。事实证明,工作流项目类型存在错误,特别是构建文件中包含的Workflow.Targets文件。
预处理器似乎就像定义了DEBUG常量一样。您可以通过创建工作流项目并将其添加到AssemblyInfo文件来重现问题:
#if DEBUG
[assembly: AssemblyFileVersion("1.0.0.0")]
#endif
然后尝试发布版本。 我用MS提交了这个:https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=466440
祝你好运! -Sean
答案 2 :(得分:0)
你确定你没有在发布模式下构建吗?
答案 3 :(得分:0)
更简单 - 您可以使用元数据标签[条件]:
标记调试功能#define DEBUG1
...
public static void PrintText1(string txt) {
Console.Write("This is PrintText2\n");
}
[Conditional("DEBUG1")]
public static void PrintText2(string txt) {
Console.Write("This is PrintText2\n");
}
[STAThread]
static void Main(string[] args) {
PrintText1("This is the unconditional method");
PrintText2("This function will be called only if 'DEBUG1' is defined");
}
试试吧!
此外,我注意到#define
仅存在于其定义的文件的上下文中,从另一个文件调用PrintText2,其中未定义调试,将不执行。这也是相反的方式:
[Conditional("DEBUG1")]
public static void ConditionedPrint(string txt) {
Console.Write("This is PrintText2\n");
}
public static void UnconditionedPrint(string txt) {
ConditionedFunc(txt);
}
UnconditionedFunc将打印“This is PrintText2 \ n”iff(当且仅当)#define DEBUG1在此文件中定义,而不管其他文件。
还有System.Diagnostics.Debug,我不知道它做了什么。
答案 4 :(得分:0)
要跟进@yoyoyoyosef评论答案,您需要查看项目的“属性”页面。
您将在Build菜单的General标题下看到,确保未选中“Define DEBUG constant”复选框。
此值根据“构建”菜单顶部的“配置”选项(下拉列表)进行更改。