我正在编写一个包含一些有条件编译成员的程序集,例如:
[Conditional("DEBUG")]
public static void Log(string message) { /*...*/ }
并像这样使用它:
public void DoStuff() {
Log("This will only appear on debug builds");
/* ... Do stuff ... */
}
但是当我将这个程序集提供给某人在他们的项目中使用时,我希望他们能够定义是否编译了DEBUG条件成员。
如果这不可能(例如,这些方法在编译时被完全删除),那么有没有办法打包多个配置'一个程序集(例如可能带有[AssemblyConfiguration])并根据引用程序集的配置选择它们?
另外:我没有寻找手动设置引用程序集的.csproj文件中的引用的建议;我知道我可以做到这一点,但这很乏味,必须为每一个参考做。
答案 0 :(得分:5)
[Conditional("DEBUG")]
正是您所寻找的。该属性的MSDN explanation表示:
指示编译器应忽略方法调用或属性,除非定义了指定的条件编译符号。
然而,该解释(以及许多其他人)未提及的是,需要在引用程序集中定义有问题的编译符号。换句话说,如果Assembly A
包含方法
[Conditional("DEBUG")]
public static void SomeMethod()
{ /* ... */ }
并将该程序集编译为 Release ,只要该程序集编译为SomeMethod 将从Assembly B
调用 >调试
答案 1 :(得分:2)
这些方法将独立于定义的值编译到程序集中,因此您可以使用这些方法,方法的使用将取决于编译器在编译客户端程序集时定义的内容。
换句话说,System.Diagnostics.ConditionalAttribute指示编译器应忽略METHOD CALL,而不是如何编译方法。
答案 2 :(得分:1)
当某些其他代码尝试使用该方法时,将在编译时删除方法调用。
因此,根据您的目标,您可以:
有关详情,请查看ConditionalAttribute