Re: Вызов виртуального метода из анонимного
От: Andir Россия
Дата: 31.10.06 12:54
Оценка: 20 (3)
Здравствуйте, Красин, Вы писали:

К>Возникают вопросы:

К>1. Существуют ли ситуации, когда код, похожий на приведенный, действительно не работает в partial trusted окружении?
К>2. Какова цель этого warning-а? Не является ли он заведомо ненужным?

Разбор этого ворнига: http://blogs.msdn.com/ericlippert/archive/2005/11/14/492607.aspx

C Уважением, Andir!
using( RSDN@Home 1.2.0 alpha rev. 652 ) { /* Работаем */ }
Вызов виртуального метода из анонимного
От: Аноним  
Дата: 01.11.06 03:34
Оценка: -2 :)
чесно сказать смеялся над названием темы, а я вот обхожусь без анонимности и все ок.
--------------
Любое удобство идет за счет мегагерцеф! : {<b>1</b>, <b>2</b>, <b>3</b>, 4}


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Вызов виртуального метода из анонимного
От: Красин Россия  
Дата: 31.10.06 12:23
Оценка:
Наткнулся на предупреждение компилятора C#, цель которого мне пока что неясна категорически. Код:
public class Base
{
  public virtual void Do() { }
}

public class Derived : Base
{
  public delegate void VoidHandler();

  public override void Do()
  {
    VoidHandler lala = delegate() { base.Do(); };
  }
}

Это вызывает warning:

Access to member 'Temp.Base.Do()' through a 'base' keyword from an anonymous method or iterator results in unverifiable code. Consider moving the access into a helper method on the containing type.

В документации в качестве рационального объяснения, зачем нужно это предупреждение говорится:

Calling virtual functions with the base keyword inside the method body of an iterator or anonymous methods will result in unverifiable code. Unverifiable code will fail to run in a partial trust environment.

Хм, смотрим reflector-ом:
public class Base
{
    public virtual void Do()
    {
    }
}
public class Derived : Base
{
    [CompilerGenerated]
    private void abcd1() //Имя метода изменено, чтобы оно удовлетворяло правилам c#
    {
        base.Do();
    }
    public override void Do()
    {
        VoidHandler handler1 = new VoidHandler(this.abcd1);
    }
    public delegate void VoidHandler();
}

Мы видим, что компилятор сделал тот самый хелперный метод, о котором говорится в warning-е. Такой код компилируется без проблем и не содержит никаких криминальных вещей.

Ну что же, осталось только проверить, правду ли говорят, что в partial trust окружении, такой код не будет работать. Для этого берем студию с установленными расширениями для .net 3.0, быстренько делаем .xbap приложение, публикуем на iis и запускаем его в браузере на другом компьютере. Все работает, Derived.Do вызывается отлично.

Возникают вопросы:
1. Существуют ли ситуации, когда код, похожий на приведенный, действительно не работает в partial trusted окружении?
2. Какова цель этого warning-а? Не является ли он заведомо ненужным?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.