所以我一直在使用 ILSpy 和 dnSpy 检查一些程序集,并注意到各种编译器生成的类和方法。一些例子:
Getter语法如
public Value { get; set; }
改为:
[CompilerGenerated]
public int GetValue()
{
return this.value;
}
[CompilerGenerated]
public void SetValue(int value)
{
this.value = value;
}
事件语法
public event EventHandler SomeEvent;
改为:
[CompilerGenerated]
public void Add(EventHandler someHandler)
{
EventHandler eventHandler = this.eventHandler;
EventHandler eventHandler2;
do
{
eventHandler2 = eventHandler;
EventHandler value = (EventHandler)Delegate.Combine(eventHandler2, someHandler);
eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.eventHandler, value, eventHandler2);
}
while (eventHandler != eventHandler2);
}
[CompilerGenerated]
public void Remove(EventHandler someHandler)
{
EventHandler eventHandler = this.eventHandler;
EventHandler eventHandler2;
do
{
eventHandler2 = eventHandler;
EventHandler value = (EventHandler)Delegate.Remove(eventHandler2, someHandler);
eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.eventHandler, value, eventHandler2);
}
while (eventHandler != eventHandler2);
}
此外,
yield return
导致整个生成的类实现 IEnumerator
接口,复杂的 async
/await
流变成状态机结构等。
所以问题是: 我怎样才能在上述程序集中实现编译器代码生成行为?
我试图重现这些编译器代码生成,但无论我在哪个 .NET 框架版本和 C# 语言版本下构建了我的测试应用程序(在发布模式下设置了优化复选标记),它都产生了漂亮干净的程序集,所以我所有的源代码代码原封不动。