Prism 模块引用可移植类库

Posted

技术标签:

【中文标题】Prism 模块引用可移植类库【英文标题】:Prism Module Referencing Portable Class Library 【发布时间】:2015-07-13 17:03:46 【问题描述】:

所以我有一个 WPF 应用程序,它使用 Prism Composition 来处理模块化。我的一个包含我的 Prism IModule 的库引用了一个可移植类库。当我尝试运行我的 WPF 应用程序时,出现以下异常:

Microsoft.Practices.Prism.Composition.dll 中出现“System.IO.FileNotFoundException”类型的未处理异常 无法加载文件或程序集 'System.Runtime, Version=4.0.10.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件。

这发生在我的 UntiyBootstrapper 实现的 InitializeModules 中。我很确定这是因为 Prism 正在尝试加载包含我的 Prism IModule 的库的所有依赖项,但我不太明白为什么它找不到该依赖项。到目前为止,我已经尝试重新安装 Windows 8.1 SDK,因为我读到那是 DLL 应该驻留的位置。

有没有其他人遇到过这种情况或有什么建议?

更新:我发现如果我从这个位置复制 System.Runtime.dll:“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5.1”并将其放在同一个位置作为我的 WPF exe 然后一切运行正常。我不太明白为什么 Prism 库不能加载这个 DLL。是否是 Prism 的限制,因为我在 GAC 中看不到 System.Runtime.dll,那么通常如何解决这种依赖关系?

【问题讨论】:

您是否安装了 ReSharper?当您搁置或取消搁置更改时,这是 Resharper 的一个已知问题。 不,我不知道。当我尝试运行使用 Prism 库动态加载模块的项目时,会发生此错误。 【参考方案1】:

我认为它不是 Prism,如果您创建一个 wpf 应用程序,然后引用不同的库,并且该库依赖于另一个库。然后你的主 wpf 应用程序需要引用它们。

【讨论】:

我遇到的问题与 Prism 和可移植类库组合有关,因为当您为多个目标编译 PCL 时,它将引用这些目标之间不同的任何 dll。就我而言,我看到两个 System.Runtime dll 的引用分别为 4.0.0.0 版本和 4.0.10.0 版本。我相信这会导致 Prism 出现问题,因为它试图同时加载两者,而任何给定目标上只会存在其中一个。在这一点上,我的好奇心是除了将虚拟 dll 放在输出目录中之外是否还有其他解决方法。【参考方案2】:

从我的研究看来,除了从“C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETCore\v4.5.1”复制虚拟 DLL 之外,没有办法绕过 Prism 库中的这个限制.虽然这适用于开发,但它不是部署的实际选择,因此我决定将我的 PCL 恢复为标准类库。

我得出了我的结论,因为在使用反编译器后,我看到我指定的目标的两个 System.Runtime.dll 都设置为我的 PCL 中的引用,并且看起来 Prism 库只是试图加载所有依赖项。这不适用于 PCL,因为在每种情况下都会缺少一个 System.Runtime.dll。

【讨论】:

以上是关于Prism 模块引用可移植类库的主要内容,如果未能解决你的问题,请参考以下文章

c#学习笔记02----自定义类库及反编译

可移植类库:推荐替换 [Serializable]

Visual Studio中类库和可移植类库的区别

StreamReader 和可移植类库

使用可移植类库作为 COM 接口

可移植类库是不是适用于 .net 3.5?