参考装配中的条件编译

Xen*_*ate 6 .net c# assemblies conditional-compilation

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

[Conditional("DEBUG")]
public static void Log(string message) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

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

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

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

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

Ton*_*nci 6

[Conditional("DEBUG")]正是您想要的。MSDN对该属性的解释说:

向编译器指示除非定义了指定的条件编译符号,否则应忽略方法调用或属性。

但是,该解释(以及许多其他解释)没有提到的是,有问题的编译符号需要在引用程序集中定义。换句话说,如果Assembly A包含方法

[Conditional("DEBUG")]
public static void SomeMethod()
{ /* ... */ }
Run Code Online (Sandbox Code Playgroud)

你编译组件版本,然后SomeMethod 将调用来自Assembly B只要该组件被编译为调试


Geo*_*voy 5

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

换句话说,System.Diagnostics.ConditionalAttribute 指示编译器应忽略 METHOD CALL,而不是指示如何编译该方法。