legacyCasModel = "true" и динамические данные / операции - PullRequest
3 голосов
/ 04 апреля 2011

Это похоже на Нечетное исключение в проекте MVC 3 .

У нас есть приложение ASP.NET 4.0, работающее с полным доверием. Нам нужно иметь следующую строку в нашем файле web.config, в противном случае одна из используемых нами библиотек не будет работать. (Так как он явно использует устаревшую модель CAS из предыдущих версий .NET).

<trust legacyCasModel="true" />

Учитывая этот параметр, мы не можем использовать динамическое ключевое слово или некоторые функции ASP.NET MVC, которые на него полагаются.

Например, следующий код вызывает исключение:

dynamic d = new object();
d.test = "jason";

Исключение составляет:

Dynamic operations can only be performed in homogenous AppDomain.

Можно ли заставить динамическое ключевое слово работать, если для legacyCasModel задано значение true? (Если установлено значение false, все работает нормально, кроме библиотеки, которая этого требует.)

Идеи:

  1. Учитывая, что я работаю с полным доверием, я предполагаю, что одна сборка в AppDomain использует уменьшенные разрешения (следовательно, неоднородная). Есть ли способ, которым я могу просто сказать, чтобы он работал в режиме полного доверия, делая AppDomain однородным?

  2. Могу ли я каким-либо образом провести рефакторинг своего кода, чтобы загрузить проблемную сборку в другой домен приложений? Я не знаком с типичными способами сделать это, но это кажется сложным.

  3. Есть ли еще какие-то магические настройки конфигурации, которые я могу включить, чтобы они работали?

1 Ответ

1 голос
/ 05 апреля 2011

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

        dynamic d = new object();
        d.test = "jason";
        Console.WriteLine(d.test);

Но это успешно ...

        dynamic d = new ExpandoObject();
        d.test = "jason";
        Console.WriteLine(d.test);

При использовании динамических объектов вам может потребоваться использовать ExpandoObject вместо простогостарый объект.

В случаях, когда ExpandoObject не отвечает вашим потребностям, что-то более мощное, например http://clay.codeplex.com/

=== РЕДАКТИРОВАТЬ ===

Помогает, еслиЯ полностью прочитал вопрос ...

Добавление в <trust legacyCasModel="true" level="Full" /> микса приводит к сбою обоих с предоставленной ошибкой.

«legacyCasModel» вызывает неоднородный домен, так как это способ, предшествующий .net4.Это означает, что динамические объекты и ваша старая библиотека CAS несовместимы.

Единственный допустимый обходной путь, который я вижу, - это абстрагирование старой библиотеки CAS до , работающей в отдельном домене приложения .

...