无法加载文件或程序集 Windows.winmd'
Could not load file or assembly 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.1\References\CommonConfiguration\Neutral\Windows.winmd' 或其依赖项之一。试图加载格式不正确的程序。
我已经尝试按照建议禁用 ClickOnce ,清理项目并删除 ASP.NET 不同 NET 框架的临时文件。
这是我 app.config 中的启动标签
我正在使用 VS2015 和 C#
我该如何修复它并生成我的 msi?
PS: 我用一个简单的 WPF 桌面应用程序生成另一个 msi 没问题。
是的,您作为参考添加的 Windows.winmd 文件是部署项目的障碍。您使用的工具对其内容感到困惑,它 看起来 就像一个 .NET 程序集。但事实并非如此,.winmd 文件格式是旧的 COM 类型库格式的扩展。对于WinRT,他们使用.NET的元数据格式来突破TLB文件格式的限制。
这是个好主意,许多 .NET 工具都可以使用元数据 as-is。与编译器和反汇编器一样,它们不必将所有基础设施都安装到位。但它严格地扮演着 参考程序集 的角色,只有编译器使用它的内容,它永远不应该被部署。现在你不太喜欢那个好主意:)
但是,修复 ClickOnce 部署非常容易。使用项目 > 属性 > 发布选项卡 > 应用程序文件按钮。将 Windows.winmd 的 "Publish Status" selection 更改为 "Exclude"。示例项目 screen-shot:
您所说的 "Microsoft Installer" 不是很清楚,我假设您谈论的是安装项目。尽管由于长期存在的问题而从 Visual Studio 中移除,但它仍然可以在图库中找到。
这是一个更难破解的难题,您通常会使用“添加”>“项目输出”上下文菜单条目让它找出依赖项。那不再起作用了,它死于悲惨的 non-descript 错误消息:
ERROR: An error occurred while validating. HRESULT = '80070057'
错误代码表示 "Invalid parameter",这无助于缩小问题范围。但是您可以安全地假设它在尝试解析 .exe 程序集中的 Windows.winmd 引用时死掉。
解决方法是不要让它auto-detect依赖项,而是自己选择它们。在标题为 "File System on Target machine" 的编辑器屏幕中,select 应用程序文件夹。 Right-click "Primary output from ..." 和 select 删除。
Right-click Application Folder > Add > File 并从 bin\Release 文件夹中选择项目的 .exe 文件。对其他文件重复此操作,您可以使用在 ClickOnce 应用程序文件列表中获得的文件列表作为指南。
构建项目,你现在得到:
WARNING: Unable to find dependency 'WINDOWS' (Signature='(null)' Version='255.255.255.255') of assembly 'WindowsFormsApplication144.exe'
这完全是良性的,我们不希望它找到它,Setup.exe 程序工作正常。
我的 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.1\References\CommonConfiguration\Neutral\Windows.winmd' 或其依赖项之一。试图加载格式不正确的程序。
我已经尝试按照建议禁用 ClickOnce
这是我 app.config 中的启动标签
我正在使用 VS2015 和 C# 我该如何修复它并生成我的 msi?
PS: 我用一个简单的 WPF 桌面应用程序生成另一个 msi 没问题。
是的,您作为参考添加的 Windows.winmd 文件是部署项目的障碍。您使用的工具对其内容感到困惑,它 看起来 就像一个 .NET 程序集。但事实并非如此,.winmd 文件格式是旧的 COM 类型库格式的扩展。对于WinRT,他们使用.NET的元数据格式来突破TLB文件格式的限制。
这是个好主意,许多 .NET 工具都可以使用元数据 as-is。与编译器和反汇编器一样,它们不必将所有基础设施都安装到位。但它严格地扮演着 参考程序集 的角色,只有编译器使用它的内容,它永远不应该被部署。现在你不太喜欢那个好主意:)
但是,修复 ClickOnce 部署非常容易。使用项目 > 属性 > 发布选项卡 > 应用程序文件按钮。将 Windows.winmd 的 "Publish Status" selection 更改为 "Exclude"。示例项目 screen-shot:
您所说的 "Microsoft Installer" 不是很清楚,我假设您谈论的是安装项目。尽管由于长期存在的问题而从 Visual Studio 中移除,但它仍然可以在图库中找到。
这是一个更难破解的难题,您通常会使用“添加”>“项目输出”上下文菜单条目让它找出依赖项。那不再起作用了,它死于悲惨的 non-descript 错误消息:
ERROR: An error occurred while validating. HRESULT = '80070057'
错误代码表示 "Invalid parameter",这无助于缩小问题范围。但是您可以安全地假设它在尝试解析 .exe 程序集中的 Windows.winmd 引用时死掉。
解决方法是不要让它auto-detect依赖项,而是自己选择它们。在标题为 "File System on Target machine" 的编辑器屏幕中,select 应用程序文件夹。 Right-click "Primary output from ..." 和 select 删除。
Right-click Application Folder > Add > File 并从 bin\Release 文件夹中选择项目的 .exe 文件。对其他文件重复此操作,您可以使用在 ClickOnce 应用程序文件列表中获得的文件列表作为指南。
构建项目,你现在得到:
WARNING: Unable to find dependency 'WINDOWS' (Signature='(null)' Version='255.255.255.255') of assembly 'WindowsFormsApplication144.exe'
这完全是良性的,我们不希望它找到它,Setup.exe 程序工作正常。