无法加载文件或程序集Windows.winmd’

我的WPF桌面应用程序也使用WinRT类。

为了做到这一点,我按照本教程https://software.intel.com/en-us/articles/using-winrt-apis-from-desktop-applications 。

很好,它的工作原理。

现在,当我尝试生成msi文件时(我尝试使用Microsoft Installer和ClickOnce),我收到此错误:

问题产生清单。 无法加载文件或程序集’C:\ Program Files(x86)\ Windows Kits \ 8.1 \ References \ CommonConfiguration \ Neutral \ Windows.winmd’或其依赖项之一。 尝试加载格式不正确的程序。

我已经尝试过这里建议禁用ClickOnce,清理项目并删除不同.NET框架的ASP.NET临时。

这是我的app.config中的启动标记

我正在使用VS2015和C#如何修复它并生成我的msi?

PS:使用简单的WPF桌面应用程序生成另一个msi没问题。

是的,您添加的Windows.winmd文件作为参考是部署项目的障碍。 您使用的工具对其内容感到困惑,它看起来就像.NET程序集。 但事实并非如此,.winmd文件格式是旧的COM类型库格式的扩展。 对于WinRT,他们使用.NET的元数据格式来克服TLB文件格式的限制。

这是一个非常好的主意,许多.NET工具可以按原样使用元数据。 与编译器和反汇编器一样,他们不必将所有基础设施都放在适当的位置。 但它严格地扮演参考汇编的角色,只有编译器使用它的内容,它永远不应该被部署。 现在你不太喜欢那个好主意:)

但是,修复ClickOnce部署非常容易。 使用项目>属性>发布选项卡>应用程序文件按钮。 将Windows.winmd的“发布状态”选项更改为“排除”。 示例项目屏幕截图:

在此处输入图像描述


你不是很清楚“Microsoft Installer”是什么意思,我假设你谈到一个安装项目。 虽然由于长期问题而从Visual Studio中删除,但它仍然可以在库中找到。

这是一个难以破解的难题,您通常使用Add> Project Output上下文菜单条目来让它找出依赖关系。 这不再起作用,它死于悲惨的非描述性错误消息:

错误:validation时发生错误。 HRESULT =’80070057′

错误代码表示“无效参数”,这无助于缩小问题范围。 但您可以放心地假设它在尝试解析.exe程序集中的Windows.winmd引用时死亡。

解决方法是让它自动检测依赖项,而是自己选择它们。 在标题为“目标计算机上的文件系统”的编辑器屏幕上,选择“应用程序文件夹”。 右键单击“来自…的主输出”,然后选择“删除”。

右键单击“应用程序文件夹”>“添加”>“文件”,然后从bin \ Release文件夹中选择项目的.exe文件。 对其他文件重复,您可以使用ClickOnce应用程序文件列表中的文件列表作为指导。

建立项目,你现在得到:

警告:无法找到程序集“WindowsFormsApplication144.exe”的依赖项“WINDOWS”(Signature =’(null)’Version =’255.255.255.255’)

哪个完全是良性的,我们不希望它找到它,Setup.exe程序工作正常。