So I've been inspecting some 3rd party assembly with ILSpy & dnSpy and noticed various compiler generated classes and methods. Some examples:
Getter syntax like public Value { get; set; }
is changed into:
[CompilerGenerated]
public int GetValue()
{
return this.value;
}
[CompilerGenerated]
public void SetValue(int value)
{
this.value = value;
}
Event syntax like public event EventHandler SomeEvent;
is changed into:
[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);
}
Also, yield return
leads to entire generated class that implements IEnumerator
interface, complex async
/await
flows are turned into state machine structs etc.
So the question is: how can I achieve the complier code generation behaviors in my assembly described above?
I've tried to reproduce these compiler code generations in my test assembly but no matter under which .NET framework version and C# language version I've built my test app (in Release mode with Optimize checkmark set) it produced nice and clean assembly where ILSpy is able to produce all my source code as it wasn't even compiled.
UPDATE: After turning off all ILSpy decompilation features I received somewhat similar results for my test assembly but there is still event
syntax present. So the follow-up question is: in which cases decompilers fail to automatically decompile various syntax structures of C# language and how to achieve such behavior in own assembly?