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

Я недавно пытался обновить проект .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);

РЕДАКТИРОВАТЬ 2: Ошибка пузырилась, чтобы выдать ошибку 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, но я считаю, что это было бы намного сложнее.

спасибо.

Ответы [ 2 ]

3 голосов
/ 14 марта 2011

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

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

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

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

1 голос
/ 11 марта 2011

Устраняет ли это проблему?

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;

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

...