2012-01-19 4 views
7

У меня есть некоторый код, который опирался на методы не встраиваемыми:Использует ли .Net 4 встроенные методы 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 
    } 
} 

Конечно это работает только если метод DoSomething не встраиваются. Именно поэтому базовый класс происходит от MarshallByRefObject, что предотвращает включение общих методов.

Это сработало до сих пор, но я получил стек с сервера .Net 4, показывающий, что stackwalk достиг звонка DoSomething.

Является ли .Net 4 более сложным и обнаруживает, что MyClass является внутренним и не имеет шансов заменить его прокси?

+0

Невозможно работать здесь. Может быть, нужно проксировать только вызов извне класса. Когда джиттеру предлагается генерировать код для самого класса, он * знает *, что ему нужен локальный экземпляр типа. Так что встраивание разрешено. Измененные правила вложения для .NET 4 - это то, что на самом деле байт. –

+0

На самом деле метод DoSomething вызывается из другого класса. Вот почему я думаю, что он не должен быть встроен ... – thinkbeforecoding

ответ

0

В комментариях здесь указано, что вам также необходимо указать NoOptimisation, чтобы достичь того, чего вы хотите.

http://connect.microsoft.com/VisualStudio/feedback/details/162364/methodimpl-methodimploptions-noinlining-doesnt-work-correctly-on-x64

+0

Функция, отсутствующая в стеке, является DoSomething. Метод Execute не встроен. Но я должен добавить nooptimisation в любом случае в Execute, чтобы быть уверенным, что он никогда не сделает это. – thinkbeforecoding