因此,我一直在开发一个项目,一切进展顺利,直到 NullReferenceException:对象引用未设置为对象的实例
错误开始仅在 View 的 XAML 设计器中弹出以及堆栈跟踪。不过该项目会运行良好。
为了找到此错误的原因,我开始注释掉有问题的 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
}*/
}
我花了两天时间试图解决这个问题,并试图在错误似乎演变为时找到确切的原因
无法加载文件或程序集“[ProjectName],version=0.0.0.1,Culture=neutral,PublicKeyToken=null”。系统找不到指定的文件夹
和
类型引用找不到名为“{clr-namespace:[ProjectName].ViewModels.SubViewModels; assembly = [ProjectName]}ErrorViewModel”的类型。
同样,这仅发生在 XAML 设计器中,并且这些错误的行号是 viewModel 和 subview 的声明:
<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>
奇怪的是,这些错误的数量取决于我打开的 View 数量(始终在声明中),而且我仍然可以运行该项目。
无论多少构建、重建或清理似乎都不重要,我已经验证了项目的 dll 位于 bin 文件夹中,我尝试过但未能使用 fuslogvw(无法弄清楚如何获取项目的日志,我只成功地使用 PowerShell.exe 捕获了一些我没有使用的内容),并且我查看了我能找到的有关这些错误的所有 150 多个问题。知道我应该做什么来解决这个问题吗?
更新:考虑了下面 Mark 的答案后,我从项目中排除并移动了可疑的 View 和 ViewModel,并将它们替换为同名的全新文件。一切看起来都很好,直到我再次添加回 DataContext。有没有办法让项目被破坏,所以即使我正在清理和重建解决方案,VS 仍然使用错误的数据或其他东西?这太令人抓狂了。
更新2:我想,我不会盲目地在黑暗中刺伤,而是将所有文件复制到一个新文件夹并恢复到我上次提交的工作正常的状态,然后将更改复制到然后再试一次。恢复后,我构建了旧项目,在尝试复制新文件之前我遇到了同样的问题!
这必须指向损坏的文件或其他什么?
最佳答案
该 View 由 XAML 设计器创建,并且由于您已在 XAML 中声明了数据上下文,因此它也会创建该 View 的实例。您的 vm:Pg7FirmwareUpdateViewModel
中的某些内容未正常运行,这就是导致错误的原因。如果不查看该类的源代码,就无法真正提供任何帮助。
这就是为什么像 MVVM Light 这样的东西会公开 IsInDesignMode
属性,这样您就可以确保代码中有问题的部分不会在设计器中执行。
关于c# - WPF/MVVM :'Could not load file or assembly' 和 'Type reference cannot find type',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60608637/