Редактирование XAML приводит к сбою Visual Studio Designer
Оригинальный вопрос
Я работаю над WPF-приложением с Visual Studio 2010, используя Telerik
.
Я работаю с большим количеством сбоев каждый раз, когда я использую конструктор: нажатие на элемент, изменение его положения, даже изменение его имени приводит к сбою и отображает следующее исключение:
System.ArgumentNullException
Value cannot be null.
to System.RuntimeType.MakeGenericType(Type[] instantiation)
to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.GetRuntimeType(Type type)
to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkType.TryGetRuntimeType()
to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.EnsureRuntimeType(Type type)
to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkProvider.GetRuntimeType(Type reflectionType)
[...]
Я пробовал следующие вещи:
- Удалите и переустановите Telerik;
- Удалить и переустановить .NET 4.0;
- Удалите и переустановите Visual Studio.
Ни одна из этих попыток не работала.
Сегодня утром я заметил, что дизайнер вообще не разбился, и я понял, почему: дизайнер разбивает , когда я открывал или редактировал XAML.
После открытия XAML Visual Studio начинает замораживаться, и дизайнер падает каждый раз, когда я пытаюсь щелкнуть что-то. Если я закрою Visual Studio и построю решение (без открытия XAML), все отлично работает с дизайнером.
Я предполагаю, что что-то пойдет не так, когда Visual Studio пытается "преобразовать" код XAML в графические элементы в конструкторе и только в этом направлении.
Вопрос: Вы когда-нибудь экспериментировали с этим? У вас есть идея о почему модификация XAML вызывает сбои и способы их решения?
Спасибо заранее.
Новые действия после чтения ответов
- Отлаживать экземпляр Visual Studio при открытии конструктора. Метод, который приводит к
ArgumentNullException
, равен GetRuntimeTime
. Я смог увидеть код .NET, но не смог определить источник проблемы. См. Полную трассировку стека ниже:
![enter image description here]()
Кроме того, это точная строка, в которой происходит ошибка, и сведения об исключении. Обратите внимание, что файл VSIsolationProviderService.cs
и что я могу видеть источник благодаря .NET Reflector Object Browser
.
![enter image description here]()
Message=Value cannot be null.
Source=mscorlib
StackTrace:
to System.RuntimeType.MakeGenericType(Type[] instantiation)
InnerException: null
Наконец, инспектор Local Variables
в момент исключения показывает следующий объект:
![enter image description here]()
Конец объекта:
![enter image description here]()
Ответы на комментарии:
- Значение
this._targetFrameworkProvider
в строке, где происходит исключение, приведено ниже.
![enter image description here]()
Ответы
Ответ 1
Думаю, лучше всего отлаживать Visual Studio!
- Запустите Visual Studio (экземпляр # 1) и загрузите свое решение
- Запустите второй экземпляр Visual Studio (# 2)
- Из экземпляра # 2 go, Debug- > Attach to process- > Выберите devenv.exe(экземпляр # 1, обязательно выберите Managed debugging)
- Затем выберите Debug- > Exception, нажмите "Найти.." и выполните поиск System.ArgumentNull, затем отметьте "Брошенный"
- Перейдите к экземпляру # 1, загрузите его в конструктор, это должно вызвать точку прерывания в экземпляре # 2, и оно должно показать полную трассировку стека. Эта информация должна быть достаточной для идентификации нарушающего контроля/компонента.
Ответ 2
Я считаю, что проблема, которую вы видите, связана с одним из элементов управления, которые вы используете.
Позвольте мне сначала показать вам способ воспроизвести эту проблему; если это та же проблема, которую вы видите. (Я использую VS 2013, который обрабатывает эту проблему немного лучше, чем vs 2010)
Во-первых, я создал настраиваемый элемент управления, который является TextBox; и у меня есть код, который выглядит примерно так.
public class CustomTextBox : TextBox
{
public string testText { get; set; }
public CustomTextBox()
: base()
{
if (string.IsNullOrEmpty(testText))
{
throw new ArgumentNullException();
}
}
}
то я поставил этот элемент управления в xaml
<Grid>
<local:CustomTextBox/>
</Grid>
Все, что я делаю, - это исключение, когда свойство имеет значение null, когда элемент управления вызывает его конструктор (который он будет делать, когда в дизайнере, когда дизайнер пытается его обновить и отобразить).
В VS2013 у меня просто есть красная строка под элементом управления в самом XAML, но из прошлого опыта с VS2010 эта проблема привела к тому, что дизайнер упал.
Что я могу вам предложить, это пройти через XAML без дизайнера и вытащить любой сторонний/пользовательский элемент управления за один раз. Один из этих элементов управления может вызывать исключение, которое может создавать то, что вы видите. Если один из элементов Telerik, связавшись с ними, является опцией.
Ответ 3
Как ранее говорил Гэвин, попробуйте найти элемент управления, который является проблемой.
Вы можете редактировать файлы в VS, если вы щелкните правой кнопкой мыши по файлу .xaml, выберите Open With
и выберите Source Code (Text) Editor
.
Вы можете установить его по умолчанию, если вы ожидаете, что это будет во множестве файлов, и переключите его, когда вы закончите.
Это решение откроет файлы .xaml без конструктора, но с (некоторыми) intellisense.
Ответ 4
Кроме того, я где-то читал, что если вы запускаете vs как администратор, это дает вам проблемы, попробуйте запустить Visual studio не как Admin
Прочитайте Это, несколько случайных вещей, которые вы можете попробовать.
Ответ 5
Вы можете попробовать XAMLPAD для проверки вашей страницы XAML.
Ссылка: https://msdn.microsoft.com/en-us/library/vstudio/ms742398(v=vs.90).aspx
Надеюсь, это поможет вам.
Ответ 6
Если вы считаете, что это может быть связано с компонентом, который вы используете, вы можете попробовать и отладить режим Visual Studio Design и посмотреть, в каком сценарии ArgumentNullException
выбрано или, по крайней мере, получить CallStack, когда исключение бросается.
Смотрите эту ссылку:
Устранение неполадок и отладка ошибок режима проектирования Visual Studio?
Я лично делаю это с экземпляром Blend и одним экземпляром Visual Studio вместо двух экземпляров Visual Studio.
Я бы также попробовал из полного нового проекта без каких-либо внешних зависимостей, чтобы узнать, может ли он быть связан с установкой Visual Studio
Ответ 7
Нарушение VS2010 с помощью определенного XAML является довольно известной проблемой.
Вы пробовали добавить этот код в Событие загрузки для нарушающего контроля?
if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { return; }
Что приводит к сбою конструктора WPF VS 2010 SP1?
Ответ 8
Попробуйте инициализировать объект runtimeType с помощью typeof (Тип) как
Type runtimeType = typeof(Type)
Также оценивайте значение переменных reflectionType,this,this._targetFrameworkProvider and this._targetFrameworkProvider.GetRunTimeType(reflectionType)
в часах во время отладки.
Это может вам помочь.