У меня есть некоторый код, который опирался на методы не встраиваемыми:Использует ли .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 является внутренним и не имеет шансов заменить его прокси?
Невозможно работать здесь. Может быть, нужно проксировать только вызов извне класса. Когда джиттеру предлагается генерировать код для самого класса, он * знает *, что ему нужен локальный экземпляр типа. Так что встраивание разрешено. Измененные правила вложения для .NET 4 - это то, что на самом деле байт. –
На самом деле метод DoSomething вызывается из другого класса. Вот почему я думаю, что он не должен быть встроен ... – thinkbeforecoding