我当前的代码情况是我在程序集A中有以下代码:
public class Foo
{
public Foo()
{
CreateDebugMessage();
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
private void CreateDebugMessage()
{
AddMessageType(MessageType.Debug, "Debug",
"/Company.App.Class;component/Images/image.png", Brushes.Green, false);
}
}
一些额外的信息是我使用MEF并且从构造函数调用此方法。我有一个程序集B(我导入程序集A),这取决于我是在DEBUG还是RELEASE模式,我希望在实例化类时创建Debug消息:
var foo = new Foo();
如果我处于调试模式,我希望创建调试消息。 如果我处于发布模式,我不希望创建调试消息。
我认为Conditional属性会比#iF DEBUG语句更好。 This question向我展示了我的错误!因为在运行时从未达到该方法。
此时我理解" #iF Debug"和#34; [有条件的(" DEBUG")]"声明不会因为我想达到的目标而削减它。
因此,我的问题是,如何使这种情况有效?
答案 0 :(得分:3)
该属性可以正常工作,请参阅Conditional Compilation in Referenced Assemblies。该属性取决于调用程序集的编译符号。我测试并证实了这一点:在Release上编译的[Conditional("DEBUG")]
程序集中的方法只有在Debug中编译调用程序集时才会被调用。如果您不是这种情况,则您的代码与您的描述不符。
您问题中的相关部分当然是“此方法是从构造函数中调用的。”。该属性适用于直接调用者,在您的情况下,该属性是包含类的构造函数,即Release。
您必须公开并明确调用方法:
public class Foo
{
public Foo()
{
}
[Conditional("DEBUG")]
[DebuggerStepThrough]
public void CreateDebugMessage()
{
AddMessageType(MessageType.Debug, "Debug",
"/Company.App.Class;component/Images/image.png", Brushes.Green, false);
}
}
var foo = new Foo();
foo.CreateDebugMessage();