属性构造函数不能使用console.writeline

phi*_*hil 1 c# custom-attributes

所以我很好奇如果我将CallerMemberName属性应用于Attribute的构造函数的参数会发生什么.这是我非常简单的代码.

class MyAttribute : Attribute
{
    public MyAttribute(string message, [CallerMemberName] string name = "none specified")
    {
        Console.WriteLine("\{message}: \{name}");
    }
}
[My("Program")]
class Program
{
    [My("Main")]
    static void Main(string[] args)
    {
        var MyAttribute = new MyAttribute("Inner");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

我运行代码,什么也没发生.所以我在构造函数中放置了一个断点,看它是否会被击中.确实如此.但是,即使Writeline调用似乎正在执行,也没有任何东西出现.为什么不?

此外,断点没有被[My("Program")]属性命中.为什么不?

编辑:根据SLaks的回答,有一个竞争条件对该计划可能是致命的.我将构造函数的内部更改为:

new Thread(() =>
{
    Thread.Sleep(1000);
    Console.WriteLine("\{message}: \{name}");
}).Start();
Run Code Online (Sandbox Code Playgroud)

Main和Inner属性以这种方式打印,但Program属性不打印.这是为什么?

SLa*_*aks 6

这是CLR加载程序中的错误.

如果在启用VS主机进程的情况下运行并Console.WriteLine()在应用于该Main()函数的属性的构造函数中调用,或者(IIRC)包含它的类,则将触发重入竞争条件Console,并且Console将在生命周期内完全中断该计划.

不要那样做.

  • @JeppeStigNielsen:因为`vshost`加载器获取`Main()`的属性来检查`[STAThread]`. (2认同)