System.Security.VerificationException: операция может дестабилизировать среду выполнения. (Дозвуковой 2.2)

Недавно я попытался обновить проект .net 2.0, DAL которого был сгенерирован SubSonic 2.2, до .NET 4.0 в Visual Studio 2010.

Проекты конвертировались без ошибок, но теперь я получаю довольно мерзкое сообщение об ошибке, когда пытаюсь его запустить.

System.Security.VerificationException: Operation could destabilize the runtime.  

at SubSonic.DataProvider.ApplyConfig(NameValueCollection config, Boolean& parameterValue, String configName) in C:\Documents and Settings\Desktop\4.0 Production\rel_1.0\server\Server.DAL\Server.DAL.SubSonic\DataProviders\DataProvider.cs:line 955
   at SubSonic.DataProvider.Initialize(String name, NameValueCollection config) in C:\Documents and Settings\Desktop\4.0 Production\rel_1.0\server\Server.DAL\Server.DAL.SubSonic\DataProviders\DataProvider.cs:line 916
   at System.Web.Configuration.ProvidersHelper.InstantiateProvider(ProviderSettings providerSettings, Type providerType)

Код, в котором выдается исключение:

    ApplyConfig(config, ref extractClassNameFromSPName, ConfigurationPropertyName.EXTRACT_CLASS_NAME_FROM_SP_NAME);

    private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref bool parameterValue, string configName)
    {
        if(config[configName] != null)
        {
            parameterValue = Convert.ToBoolean(config[configName]);
        }
    }

Он выполняет аналогичные вызовы здесь, с той лишь разницей, что это строго строка, а не логическое значение, которым он манипулирует.

private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref string parameterValue, string configName)
{
    if(config[configName] != null)
    {
        parameterValue = config[configName];
    }
}

config определяется как System.Collections.Specialized.NameValueCollection с 3 ключами generateNullableProperties, connectionStringName, generateNamespace ExtractClassNameFromSPName == false

EDIT1: код, вызывающий ошибку, находится в методе Application_Start() объекта Global.asax.

System.Data.SqlClient.SqlDependency.Start(SystemSetting.Schema.Provider.DefaultConnectionString);

EDIT2: ошибка всплывает, указывая на ошибку targetinvocation, ссылающуюся на мой файл web.config.

<SubSonicService defaultProvider="appPlan">
    <providers>
        <clear/>
        <add name="appPlan" type="SubSonic.SqlDataProvider, appPlan.Server.DAL.SubSonic" generateNullableProperties="false" connectionStringName="appPlan" generatedNamespace="appPlan.Server.DAL"/>
    </providers>
</SubSonicService>

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

благодаря.


person Christopher Klein    schedule 04.03.2011    source источник
comment
Я без проблем обновил несколько веб-сайтов, использующих SubSonic 2.0.3 (с множеством настроек) с 2.0 -> 3.5 -> 4.0. Я удалил некоторых провайдеров, которых никогда не использовал, так как у меня были проблемы с тем, что они не поддерживали x64.   -  person Zachary    schedule 08.03.2011
comment
Я удалил Oracle, MySql и SqlLite, думая, что там может быть конфликт, но я получаю ту же проблему.   -  person Christopher Klein    schedule 08.03.2011
comment
Система конфигурации довольно активно использует отражение. При доступе к свойству кажется, что какой-то код настроенного провайдера Jated. В этот момент среда выполнения проверяет сгенерированный код и говорит вам: Нет, этот тип плохой. Чтобы найти основную причину, вам нужно взглянуть с помощью Reflector на SubSonic.SqlDataProvider.   -  person Alois Kraus    schedule 14.03.2011
comment
Если у вас установлен .Net 4.5 (который устанавливается поверх .Net 4.0), то это может быть связано с ошибкой, связанной с платформой .Net 4.5 и уровнями доверия со сторонними библиотеками и библиотеками фреймворка. Если вы все еще используете обходной путь SecurityRules, вы можете проверить это исправление, чтобы узнать, применимо ли оно к вам и устраняет ли проблему (это было для моей команды) support.microsoft.com/kb/2748645   -  person Arkaine55    schedule 30.10.2013


Ответы (2)


Это решает проблему?

private static void ApplyConfig(System.Collections.Specialized.NameValueCollection config, ref bool parameterValue, string configName)
{
    if(config[configName] != null)
    {
        string val = config[configName];
        parameterValue = Convert.ToBoolean(val);
    }
}

Если нет, то попробуй

string val = config[configName];
if (val.ToLower() == "false")
    parameterValue = false;
else
    parameterValue = true;

Может быть 2 причины, по которым исходный код не работает. Во-первых, более ранняя версия .NET (вероятно, 1.1) имела некоторые проблемы с типом. Я не знаю, что именно, но я подозреваю, что он мог не определить тип значения, переданного прямо из NameValueCollection в ToBoolean. Вторая возможность заключается в том, что значение не "истина" или "ложь", а что-то другое. Опять же, эти 2 могут быть или не быть причиной. Я не могу знать точно, потому что у меня нет SubSonic 2.2.

person Fun Mun Pieng    schedule 11.03.2011
comment
Я пробовал это, но на самом деле ошибка возникает при: if(config[configName] != null), а не при логическом преобразовании. Я обманывал, пока не разобрался, и добавил это в файл AssemblyInfo.cs:: [assembly: SecurityRules(SecurityRuleSet.Level1, SkipVerificationInFullTrust = true)] Я нашел упоминание о проблеме прозрачности .net4 и .net2 с Unreliable /unsafe код и правила безопасности .net4.0, добавляющие строку в файл, говорят ему использовать правила 2.0 (насколько я могу судить) - person Christopher Klein; 12.03.2011

Я видел это исключение раньше при создании сборок непосредственно из созданного вручную IL. Среда выполнения .NET проверяет необработанные инструкции в сборке на правильность, особенно при загрузке сборки в контексты с ограниченным доступом. Например, есть проверка, чтобы убедиться, что необходимое количество аргументов загружено в стек вызовов перед выполнением метода.

Сборку можно загрузить, даже если проверка не пройдена; но его можно запустить только с полным доверием. В сценариях с частичным доверием вы получаете эту ошибку «операция может дестабилизировать среду выполнения». Причина в том, что среда выполнения не может гарантировать безопасную работу сборок с частичным доверием, если они не «ведут себя правильно».

Вы можете вручную проверить сборку с помощью инструмента PEVERIFY (доступного через командную строку Visual Studio). Попробуйте проверить все упомянутые сборки, чтобы узнать, что сообщается. Я подозреваю, что в правилах проверки между .NET 2.0 и .NET 4.0 произошли изменения, которые теперь приводят к сбою проверки для одной из сборок SubSonic 2.2.

Ваш чит, который вы упомянули в ответ на Fun Mun Pieng, также предполагает, что проблема заключается в проверке.

person Michael Petito    schedule 14.03.2011