Xamarin Mac与Windows版Xamarin Forms程序集引用命名冲突求助
解决Xamarin Mac下Stateless.dll大小写不匹配导致的程序集找不到问题
问题根源
你的自定义类库依赖Stateless v4.2.1,发布到私有NuGet后,Windows平台Xamarin Forms应用会下载Stateless.dll(首字母大写),但Xamarin Mac环境下下载的却是全小写的stateless.dll。由于macOS文件系统区分大小写,应用运行时会按照类库引用的Stateless(大写)查找文件,无法匹配实际存在的小写版本,因此抛出找不到程序集的错误。
可行解决方案
1. 清理NuGet缓存并重新还原
Mac本地NuGet缓存可能留存了大小写错误的包,先清空缓存再重新还原依赖:
# 清空所有NuGet本地缓存 nuget locals all -clear # 切换到项目根目录,执行还原 dotnet restore
完成后重新构建Xamarin Mac项目,检查输出目录里的Stateless.dll文件名是否恢复正确。
2. 自定义类库打包时强制文件名一致性
在你的自定义类库项目文件中添加配置,确保打包时依赖的Stateless程序集文件名保持正确大小写:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>netstandard2.0;netstandard2.1;netcoreapp3.1;net472</TargetFrameworks> <!-- 强制复制锁定文件中的程序集到输出目录 --> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> </PropertyGroup> <ItemGroup> <PackageReference Include="stateless" Version="4.2.1" /> </ItemGroup> <!-- 添加目标,自动修正输出目录中的文件名大小写 --> <Target Name="FixAssemblyFileNameCase" AfterTargets="CopyFilesToOutputDirectory"> <Move SourceFiles="$(OutputPath)stateless.dll" DestinationFiles="$(OutputPath)Stateless.dll" Condition="Exists('$(OutputPath)stateless.dll')" /> <Move SourceFiles="$(OutputPath)stateless.pdb" DestinationFiles="$(OutputPath)Stateless.pdb" Condition="Exists('$(OutputPath)stateless.pdb')" /> </Target> </Project>
重新打包并发布自定义类库到私有NuGet服务器,之后在Xamarin Mac项目中更新该类库引用并重新构建。
3. 手动修正输出目录中的文件名
如果前两种方法无效,可以直接手动修正:
- 找到Xamarin Mac项目的输出目录(例如
bin/Debug/net6.0-macos/,根据你的目标框架调整) - 将
stateless.dll和stateless.pdb重命名为Stateless.dll和Stateless.pdb - 重新打包应用,部署到其他Mac设备测试
4. 检查私有NuGet服务器上的包完整性
下载私有NuGet服务器上你的自定义类库包(.nupkg格式),解压后检查包内的依赖文件是否是正确大小写的Stateless.dll。如果包内是小写文件,说明打包过程存在问题,需要按照方案2的配置重新打包发布。
内容的提问来源于stack exchange,提问作者MaxDestiny
相关产品推荐
相关产品推荐

