在引用程序集中的条件编译

7

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

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

并像这样使用它:

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

但是,当我把这个程序集交给别人用于他们的项目时,我希望他们能够定义是否编译DEBUG条件成员。
如果不可能(例如,在编译时方法完全被删除),那么有没有办法打包多个程序集的“配置”(例如,使用[AssemblyConfiguration])并根据引用程序集的配置选择它们?
另外:我不想要手动设置引用程序集的.csproj文件的建议;我知道我可以这样做,但这很繁琐,而且必须为每个引用都要这样做。

嗯...如果你正在使用 DI,也许拦截器是你需要的。=/ - marcoaoteixeira
只需为它们准备2个dll:调试和发布版本,并使用条件引用,或者您可以使Log方法检查某些内容,然后执行任务或忽略调用 - Sinatr
@Sinatr 你不需要这两个dll,它取决于客户端程序集的编译定义。 - George Polevoy
3个回答

8
[Conditional("DEBUG")] 正是您所寻找的内容。该属性的MSDN说明如下:

指示编译器忽略特定条件编译符号未定义时的方法调用或属性。

然而,该说明(以及许多其他说明)未提到的是,所需的编译符号需要在引用程序集中定义。换句话说,如果Assembly A包含方法时,它必须定义所需的编译符号。
[Conditional("DEBUG")]
public static void SomeMethod()
{ /* ... */ }

如果您将该汇编编译为“发布”模式,那么只要该汇编以“调试”模式编译,Assembly B中的SomeMethod就会被调用。

5

这些方法将独立于定义的值编译成程序集,因此您可以使用这些方法,而方法的使用取决于编译客户端程序集时的编译器定义。

换句话说,System.Diagnostics.ConditionalAttribute指示编译器忽略方法调用,而不是方法的编译方式。


1

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

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

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

有关更多信息,请查看ConditionalAttribute


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