WPF / MVVM: «Не удалось загрузить файл или сборку» и «Ссылка на тип не может найти тип» - PullRequest
2 голосов
/ 10 марта 2020

Итак, я работал над проектом, и все шло нормально, пока ошибка NullReferenceException: Object reference not set to an instance of an object не начала появляться только в конструкторе XAML для View вместе с трассировкой стека. Однако проект будет работать нормально.

Чтобы найти причину этой ошибки, я начал закомментировать код как в оскорбительном View, так и во ViewModel. Это дало бы противоречивые и странные результаты, когда я закончил с почти всем закомментированным кодом.

Например, это может вызвать ошибку:

private async void FirmwareUpdateAsync()
{
    bool isOK = true;
    isOK = await Task.Run(() => _usb.DeviceHandshakeAsync());

    if (!isOK)
    {
       // Left Empty
    }
}

Но это не будет:

private async void FirmwareUpdateAsync()
{
    bool isOK = true;
    isOK = await Task.Run(() => _usb.DeviceHandshakeAsync());

    /*if (!isOK)
    {
       // Left Empty
    }*/
}

Я потратил два дня, пытаясь понять это и пытаясь отследить точную причину, когда ошибка, по-видимому, переросла в Could not load file or assembly'[ProjectName], version=0.0.0.1, Culture=neutral, PublicKeyToken=null". The system cannot find the specified folder и Type reference cannot find type named'{clr-namespace:[ProjectName].ViewModels.SubViewModels;assembly = [ProjectName]}ErrorViewModel.

Опять же, это происходит только в конструкторе XAML, а номера строк для этих ошибок являются объявлениями viewModels и subviews:

<Page.DataContext>
        <vm:Pg7FirmwareUpdateViewModel/>   <= Here
    </Page.DataContext>

    <Page.Resources>
        <!-- Sets Progress Bar View -->
        <DataTemplate DataType="{x:Type svm:ErrorViewModel}">   <= Here
            <sv:ErrorView/>
        </DataTemplate>
    </Page.Resources>

Как ни странно, количество этих ошибок зависит от того, сколько представлений я открываю (всегда в объявлениях), плюс я все еще могу запустить проект.

Никаких сборок или перестроений или очистка, кажется, имеет значение, я проверил, что dll проекта находится в папке bin, я пытался, но не смог использовать fuslogvw (Не могу понять, как получить журнал для проекта, мне удалось только захватить что-то с помощью PowerShell. exe, который я не использовал), и я посмотрел на все 150+ вопросов об этих ошибках, которые я мог найти. Любая подсказка, что я должен сделать, чтобы это исправить?

ОБНОВЛЕНИЕ: Подумав об ответе Марка ниже, я исключил из проекта и переместил подозрительные View и ViewModels и заменил их новыми файлами с таким же именем. Все кажется в порядке, пока я снова не добавлю DataContext. Есть ли способ, которым проект может быть поврежден, поэтому, хотя я очищаю и перестраиваю решение, VS использует неверные данные или что-то в этом роде? Это сводит с ума.

ОБНОВЛЕНИЕ2: Вместо слепого удара в темноте, я решил, что просто скопирую все файлы в новую папку и вернусь к своему последнему коммиту, который работал нормально, затем просто скопируйте изменения и попробуйте снова. После возврата я построил старый проект, и у меня точно такая же проблема, прежде чем пытаться скопировать новые файлы!

Это должно указывать на поврежденный файл или что-то нет?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Представление создается дизайнером XAML, и, поскольку вы объявили свой контекст данных в XAML, он также создает его экземпляр. Что-то в вашем vm:Pg7FirmwareUpdateViewModel не работает должным образом, и это является причиной ошибки. Больше ничего не могу поделать, не видя исходного кода для этого класса.

Вот почему такие вещи, как MVVM Light, предоставляют свойство IsInDesignMode, поэтому вы можете гарантировать, что проблемные c части вашего кода выиграют исполниться в конструкторе.

0 голосов
/ 12 марта 2020

Я наконец сдался и просто запустил проект и скопировал все старые файлы. Когда я закончил, я вернулся к старому «NullReferenceException», где XMAL не отображался. Прогресс, га.

То, что проблема, кажется, был конструктор для отображения сообщений об ошибках. В конструкторе я передавал перечисление в качестве аргумента, ничего не делая с ним:

public class ErrorMessageModel
{
   public ErrorMessageModel(ErrorCodes errorcode, string errorName, 
                            string errorDescription, string errorTips)
   {
       ErrorName = errorName;
       ErrorDescription = errorDescription;
       ErrorTips = errorTips;
   } 

}

После удаления ErrorCodes errorcode конструктор XMAL снова работает, и все кажется стабильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...