UWP应用误将打包原生.exe加载为C#程序集启动失败
解决方案:UWP项目误加载原生exe为C#程序集导致BadImageFormatException
核心原因
XAML元数据生成器(负责生成XamlTypeInfo.g.cs)在扫描项目输出目录时,错误地将原生MinidumpWriter.exe识别为托管程序集并尝试加载解析,引发System.BadImageFormatException。
具体修复步骤
在C# XAML项目中排除原生exe的元数据扫描
编辑项目的.csproj文件,添加以下配置,让XAML编译器跳过对指定exe的扫描:<PropertyGroup> <!-- 排除MinidumpWriter.exe被XAML元数据扫描 --> <DefaultItemExcludes>$(DefaultItemExcludes);$(OutputPath)MinidumpWriter.exe</DefaultItemExcludes> </PropertyGroup> <ItemGroup> <!-- 明确标记exe为内容文件,而非程序集引用 --> <Content Include="$(OutputPath)MinidumpWriter.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <ExcludeFromXmlSerialization>true</ExcludeFromXmlSerialization> </Content> </ItemGroup>修正NuGet包的结构
确保NuGet包中的MinidumpWriter.exe放置在contentFiles\win10-<平台>\native目录下,而非lib目录。这样NuGet会将其作为原生内容文件复制到项目输出,而非作为程序集引用。例如包结构:your-nuget-package/ ├── contentFiles/ │ └── win10-x64/ │ └── native/ │ └── MinidumpWriter.exe └── lib/ └── uap10.0/ └── your-native-library.dll验证Package.appxmanifest的协议注册
确认协议关联的exe路径正确,且未被错误配置为托管组件。协议注册示例:<Extensions> <uap:Extension Category="windows.protocol"> <uap:Protocol Name="your-protocol-name"> <uap:DisplayName>Your Protocol</uap:DisplayName> <uap:Executable>MinidumpWriter.exe</uap:Executable> <uap:EntryPoint>MinidumpWriter.exe</uap:EntryPoint> </uap:Protocol> </uap:Extension> </Extensions>注意
EntryPoint要指向原生exe,而非托管类。清理项目缓存并重新生成
- 删除项目的
bin和obj文件夹 - 清理NuGet缓存:在Visual Studio中依次点击「工具」→「NuGet包管理器」→「包管理器设置」→「清除所有NuGet缓存」
- 重新生成整个解决方案
- 删除项目的
检查C++库的引用配置
确保UWP C库在引用NuGet包时,仅将MinidumpWriter.exe作为内容文件复制,而非添加为程序集引用。在C库的.vcxproj中确认相关配置:<ItemGroup> <Content Include="path\to\MinidumpWriter.exe"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </Content> </ItemGroup>
内容的提问来源于stack exchange,提问作者Cy S.
相关产品推荐
相关产品推荐

