我的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'或其依赖项之一。尝试加载格式不正确的程序。
我已尝试按照建议的here禁用ClickOnce,清理项目并删除不同.NET框架的ASP.NET临时文件。
这是我的app.config中的启动标记
我正在使用VS2015和C# 我该如何解决它并生成我的msi?
PS:使用简单的WPF桌面应用程序生成另一个msi没有问题。
答案 0 :(得分:40)
是的,您添加作为参考的Windows.winmd文件是部署项目的障碍。您使用的工具对其内容感到困惑,看起来像就像.NET程序集一样。但事实并非如此,.winmd文件格式是旧的COM类型库格式的扩展。对于WinRT,他们使用.NET的元数据格式来克服TLB文件格式的限制。
这是一个非常好的主意,许多.NET工具可以按原样使用元数据。与编译器和反汇编器一样,他们也没有必要将所有基础设施都安装到位。但它严格地扮演引用程序集的角色,只有编译器使用其内容并且永远不应该部署它。现在你不太喜欢这个好主意:))
然而,修复ClickOnce部署非常容易。使用项目>属性>发布标签>应用程序文件按钮更改"发布状态"选择Windows.winmd到"排除"。示例项目屏幕截图:
我不清楚你的意思是什么" Microsoft Installer",我假设你谈论一个安装项目。虽然由于长期问题而从Visual Studio中删除,但它仍可在库中使用。
这是一个难以破解的难题,您通常会使用添加>项目输出上下文菜单条目,让它找出依赖项。这不再起作用,它以悲惨的非描述性错误消息而死:
错误:验证时发生错误。 HRESULT =' 80070057'
错误代码表示"无效参数",这无助于缩小问题范围。但您可以放心地假设它在尝试解析.exe程序集中的Windows.winmd引用时死亡。
解决方法是不让它自动检测依赖项,但自己选择它们。在标题为"目标机器上的文件系统"的编辑器屏幕上,选择应用程序文件夹。右键单击"主要输出来自..."并选择删除。
右键单击“应用程序文件夹”>添加>从bin \ Release文件夹中提取并选择项目的.exe文件。对其他文件重复,您可以使用ClickOnce应用程序文件列表中的文件列表作为指南。
构建项目,现在得到:
警告:无法找到依赖关系' WINDOWS' (签名='(null)'版本=' 255.255.255.255')汇编' WindowsFormsApplication144.exe'
哪个完全是良性的,我们不希望它找到它,Setup.exe程序运行正常。