2012-01-19 13 views
7

que tienen un código que se basó en métodos no ser inline:¿Tiene .Net 4 métodos en línea MarshalByRefObject?

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 
    } 
} 

Por supuesto, esto sólo funciona si no se inlined el método HacerAlgo. Esta es la razón por la cual la clase base se deriva de MarshallByRefObject, que previene la creación de líneas de los métodos públicos.

Funcionó hasta ahora, pero obtuve una stacktrace de un servidor .NET 4 que muestra que el stack llegó al llamador de DoSomething.

¿Es más inteligente la .Net 4 y detecta que MyClass es interno y no tiene posibilidad de ser sustituido por un proxy?

+0

No se puede trabajar aquí. Solo una llamada desde fuera de la clase debe ser procesada. Cuando se solicita al jitter que genere código para la clase en sí, entonces * sabe * que una instancia local del tipo lo necesita. Por lo tanto, se permite la alineación. Las reglas de entrada modificadas para .NET 4 es lo que en realidad le bytes. –

+0

En realidad, el método DoSomething se llama desde otra clase. Es por eso que creo que no debería estar en línea ... – thinkbeforecoding

Respuesta