Подтвердить что ты не робот

Редактирование 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
4b9b3361

Ответ 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

Прочитайте Это, несколько случайных вещей, которые вы можете попробовать.

Ответ 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) в часах во время отладки.

Это может вам помочь.