You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:09:24