Приведение вызывает «Операция может дестабилизировать среду выполнения» на одном блоке ASP.NET 4.0, а не на другом - PullRequest
0 голосов
/ 04 октября 2011

Вот (часть) простой метод десериализации, который я использовал в .NET 2.0 в течение многих лет. T - параметр неограниченного типа.

protected virtual T ItemFromString(string s) {

    if (typeof(T).IsPrimitive ||
        typeof(T) == typeof(string)) {

        try {
            // needed for string, too: compiler doesn't allow (T)s
            return (T)Convert.ChangeType(s, typeof(T));
        }
        catch (Exception ex) {
            // stuff
        }
    }
}

Я изменил пул приложений для запуска в 4.0, и все было хорошо - пока я не развернул его на удаленном сервере. Там я получаю «Операция может дестабилизировать время выполнения» на линии

return (T)Convert.ChangeType(s, typeof(T));

(На самом деле указанная строка является конечной скобкой метода, но я сузил ее до этой строки.)

Проблема исчезнет, ​​если я вернусь к версии 2.0.

Обе версии: 4.0.30319. Приложение в остальном идентично, включая web.config. Оба приложения используют общие пулы приложений и работают в режиме полного доверия. Предположительно другой параметр влияет на это, но я понятия не имею, как выяснить, что.

Все, что я нашел об этом, включает Reflection.Emit или ковариацию, которой я не пользуюсь.

Есть ли отведения?

Спасибо.

1 Ответ

1 голос
/ 29 октября 2012

Теперь, когда этот вопрос был просмотрен 0x80 раз, я опубликую решение, которое я недавно использовал, когда больше не мог откладывать переход на .NET 4.

В сборке необходимо указать платформу .NET 4 и установить следующее свойство сборки.

using System.Security;

// Needed to enable generic deserialization in partial trust.
[assembly: SecurityRules(SecurityRuleSet.Level1)]

Я прокомментировал, что я нахожусь в режиме полного доверия, но я, должно быть, ошибся в этом. Это только проблема в частично доверенных средах.

...