2012-01-19 12 views
7

ho qualche codice che si basava su metodi non essere inline:Fa. Net 4 metodi MarshalByRefObject in linea?

internal class MyClass : BaseClass 
{ 
    // should not be inlined 
    public void DoSomething(int id) 
    { 
     base.Execute(id); 
    } 
} 

public abstract class BaseClass : MarshallByRefObject 
{ 
    [MethodImpl(MethodImplOptions.NoInlining)] 
    protected void Execute(params object[] args) 
    { 
     // does a stack walk to find signature of calling method 
    } 
} 

Naturalmente questo funziona solo se il metodo DoSomething non è inline. Questo è il motivo per cui la classe di base deriva da MarshallByRefObject, che impedisce l'inlining dei metodi pubblici.

Ha funzionato fino ad ora, ma ho ottenuto uno stacktrace da un server .Net 4 che mostra che lo stackwalk ha raggiunto il chiamante di DoSomething.

È il .Net 4 inlining più intelligente e rileva che MyClass è interno e non ha alcuna possibilità di essere sostituito con un proxy?

+0

non posso lavorare qui. Solo una chiamata dall'esterno della classe potrebbe dover essere inoltrata. Quando viene richiesto al jitter di generare codice per la classe stessa, * sa * che un'istanza locale del tipo ne ha bisogno. Quindi è permesso l'inlining. Le regole di inlining modificate per .NET 4 sono ciò che effettivamente ti danno. –

+0

In realtà, il metodo DoSomething viene chiamato da un'altra classe. Ecco perché penso che non dovrebbe essere in linea ... – thinkbeforecoding

risposta