2

我发布了这个问题,以便我可以记录解决方案,因为我发现解决它非常棘手且耗时。

我在 Silverlight 4 项目中使用了Laurent Bugnion出色的MVVM Light Toolkit,并且我在 Microsoft.Practices.ServiceLocation 中使用了他的ViewModelLocator模式。ServiceLocator为可混合性加载设计时模型。最初在Expression Blend 4中加载视图是有效的,并且设计时数据绑定非常好。这在某个时候停止工作,Blend 中根本没有任何错误消息。

我使用Visual Studio 2010 SP1附加到Blend.exe来调试问题。在这行代码中抛出了EntryPointNotFoundException (Entry point was not found) 异常:

return ServiceLocator.Current.GetInstance<ExampleViewModel>();

奇怪的是,我能够在 Visual Studio XAML 设计器中成功加载相同的视图,而我的设计时数据绑定工作正常。我使用另一个 Visual Studio 实例将调试器附加到托管 XAML 设计器的 Visual Studio 实例,并且能够确认 ServiceLocator 调用已成功执行。

异常详细信息(堆栈跟踪、InnerExcetion 等)没有为我提供有关问题的任何进一步线索,并且对无用错误消息的各种 Internet 搜索未能进一步阐明。

我最终幸运地使用了 Visual Studio 即时窗口来执行导致问题的部分代码行,并得到了更好的错误消息:

?ServiceLocator.Current

“Microsoft.Practices.ServiceLocation.dll”和“Microsoft.Practices.ServiceLocation.dll”中都存在“Microsoft.Practices.ServiceLocation.ServiceLocator”类型

将变更集与之前工作的代码进行比较,我注意到我在Silverlight 项目的单独单元测试框架(它引用了 UI 项目)中添加了对 GalaSoft.MvvmLight.Extras.SL4 的引用。该测试项目从 C:\Program Files (x86)\Laurent Bugnion (GalaSoft)\Mvvm Light Toolkit\Binaries\Silverlight4 引用程序集,而 UI 项目从 ..\packages\MvvmLightLibsPreview.4.0.0\ 引用它库\SL4。我曾使用nugetMvvmLightLibsPreview将 MVVM Light 添加到客户端项目。

混合结果 - 错误和输出窗口在任何时候都没有显示任何错误消息。显然,除非有一些 Blend 故障排除技术可以帮助我更快地解决问题,否则不需要真正的答案。

4

3 回答 3

1

我遇到了几乎相同的问题,但直到我使用 Windows 7 控制面板卸载 MVVM Light 后我的问题才消失。NuGet MVVM Light 引用仍在项目中,但现在我可以看到设计时数据。之前就坏了。

我遵循了 MVVM Light 网站上的建议并附加了 Visual Studio 2012 的 Blend 预览,并收到了您上面提到的错误 (EntryPointNotFoundException)。即使那时我也不知道我应该尝试删除两个相互冲突的不同版本的 MVVM Light。

于 2012-09-22T02:31:47.107 回答
0

如您所料,更改测试项目的 MVVM Light 程序集引用以使用客户端 UI 项目使用的相同nuget包版本可以解决问题。我不知道为什么 Visual Studio 没有两个版本的 Microsoft.Practices.ServiceLocation.dll 以与 Blend 相同的方式引用。

于 2011-11-17T00:36:06.713 回答
0

我最终试图将来自 NuGet 的包的全部内容复制到

C:\Program Files (x86)\Laurent Bugnion (GalaSoft)\Mvvm Light Toolkit\Binaries

那并没有解决问题。由于卸载 MVVM Light 带走了其他东西,例如片段,我决定返回并排除更多故障。我没有成功,只能找到一个粗略的临时解决方案。

我尝试通过查看四个 DLL 文件来比较可行的项目和不可行的项目:

GalaSoft.MvvmLight.Extras.WPF4 GalaSoft.MvvmLight.WPF4 Microsoft.Practices.ServiceLocation System.Windows.Interactivity

我看不出版本有什么不同。

因此,目前的工作是使用 Visual Studio 2012 中的 MVVM Light WPF 模板启动一个新项目,构建它,然后删除对上述四个 DLL 的引用。然后我从 NuGet 安装包 MVVM Light 并在 App.xaml 中编辑视图模型定位器的双重条目,然后程序运行正常。此时我可以在主窗口上看到设计数据消息,上面写着

“欢迎来到 MVVM Light [设计]”

于 2012-09-22T23:39:16.217 回答