如何在MAUI项目中仅为Windows平台引入原生Windows库?
如何仅在MAUI的Windows构建中包含原生DLL,排除其他平台?
要实现只让Windows原生DLL纳入Windows平台的构建/包,同时不进入Android、iOS等其他平台,有两种可靠的原生MSBuild配置方案,比手动复制或无效的清单配置更合适:
方案1:通过MSBuild平台条件在.csproj中精准控制
在项目的.csproj文件中,给DLL的包含项添加Windows目标框架专属的条件,这样只有构建Windows版本时才会处理该DLL:
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0-windows10.0.19041.0'"> <!-- 替换为你的DLL实际路径 --> <Content Include="Libraries\Windows\MyNativeLib.dll"> <!-- 确保DLL复制到输出目录 --> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <!-- 发布时也会将DLL纳入包 --> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <!-- 可选:指定输出后的文件名,避免路径嵌套 --> <Link>MyNativeLib.dll</Link> </Content> </ItemGroup>
- 注意替换
$(TargetFramework)的值为你项目实际使用的Windows目标框架(比如net7.0-windows10.0.19041.0)。 - 这个条件会让MSBuild仅在构建Windows平台时才将该DLL标记为需要复制和打包的内容,其他平台完全忽略。
方案2:利用MAUI的Platforms目录自动隔离
MAUI默认会将Platforms目录下对应平台子文件夹的内容与该平台构建绑定,你可以把Windows原生DLL直接放在Platforms/Windows目录下,然后在.csproj中添加如下配置:
<ItemGroup> <Content Include="Platforms\Windows\MyNativeLib.dll"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> </Content> </ItemGroup>
MAUI的构建系统会自动识别该文件属于Windows平台,不会将其包含到其他平台的构建包中。如果你的DLL需要按架构区分(比如x64、arm64),可以在Platforms/Windows下再创建对应架构的子文件夹,然后调整Include路径即可。
为什么你之前尝试的方法效果不好?
- 后期构建脚本复制:AppX包是在打包阶段生成的,手动复制容易出现时机不对、路径变动等问题,不属于MAUI原生支持的打包流程,维护性差。
- 全局添加DLL到.csproj:没有添加平台条件,MSBuild会默认将该文件包含到所有平台的构建中,不符合需求。
- app.manifest引用:MAUI Windows的打包逻辑依赖
Package.appxmanifest,普通的app.manifest仅用于应用运行时的配置,不会影响打包时的文件包含规则,所以修改它不会让DLL被纳入AppX包。
内容的提问来源于stack exchange,提问作者Wes Hodges
相关产品推荐
相关产品推荐

