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, сгенерированное пространство имен
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, но я бы сказал, что это будет гораздо больше.
спасибо.
Ответы
Ответ 1
Помогает ли это решить проблему?
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.
Ответ 2
Я видел это исключение раньше, когда генерировал сборки непосредственно из ручного ИЛ. Среда выполнения .NET проверяет необработанные инструкции в сборке на правильность, особенно при загрузке сборки в узкие контексты. Например, есть проверка, чтобы убедиться, что необходимое количество аргументов загружено в стек вызовов перед выполнением метода.
Сборка может быть загружена даже в случае сбоя проверки; но его можно использовать только в полном доверии. В сценариях частичного доверия вы получите эту "операцию может дестабилизировать время выполнения". Причина в том, что среда выполнения не может гарантировать безопасную работу сборок в частичном доверии, если они не "ведут себя правильно".
Вы можете вручную проверить сборку с помощью инструмента PEVERIFY
(доступного с помощью командной строки Visual Studio). Попробуйте проверить все ссылочные сборки, чтобы узнать, о чем сообщается. Я подозреваю, что произошли изменения в правилах проверки между .NET 2.0 и .NET 4.0, что теперь приводит к сбою проверки для одной из сборок SubSonic 2.2.
Ваш обман, который вы упомянули в ответ на Fun Mun Pieng, также предполагает, что проверка является проблемой.