参考装配中的条件编译

时间:2014-10-29 15:44:35

标签: c# .net assemblies conditional-compilation

我正在编写一个包含一些有条件编译成员的程序集,例如:

[Conditional("DEBUG")]
public static void Log(string message) { /*...*/ }

并像这样使用它:

public void DoStuff() {
    Log("This will only appear on debug builds");
    /* ... Do stuff ... */
}

但是当我将这个程序集提供给某人在他们的项目中使用时,我希望他们能够定义是否编译了DEBUG条件成员。

如果这不可能(例如,这些方法在编译时被完全删除),那么有没有办法打包多个配置'一个程序集(例如可能带有[AssemblyConfiguration])并根据引用程序集的配置选择它们?

另外:我没有寻找手动设置引用程序集的.csproj文件中的引用的建议;我知道我可以做到这一点,但这很乏味,必须为每一个参考做。

3 个答案:

答案 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)

当某些其他代码尝试使用该方法时,将在编译时删除方法调用。

因此,根据您的目标,您可以:

  • 如果您希望其他人有条件地使用您的" Log"方法,但你自己的程序集中的代码不应该使用方法 - 给发布程序集(一个编译没有" DEBUG")。
  • 如果您希望其他人有条件地使用您的" Log"以及你自己的代码来记录 - 给出调试程序集
  • 如果您希望能够在运行时为自己的代码打开/关闭日志记录 - 请考虑使用允许它的实际日志记录框架(即使是.Net框架的一部分也允许您这样做)。

有关详情,请查看ConditionalAttribute