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?
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. –
In realtà, il metodo DoSomething viene chiamato da un'altra classe. Ecco perché penso che non dovrebbe essere in linea ... – thinkbeforecoding