引用LZ4Net的PCL及Xamarin Forms项目编译时出现LZ4cc文件未找到错误
解决Xamarin Forms中lz4net导致的
LZ4cc程序集加载失败问题 我之前碰到过类似的非托管程序集加载坑,咱们一步步来排查和解决:
问题根源分析
lz4net依赖的LZ4cc是原生非托管程序集,而Xamarin的PCL/.NET Standard库本身无法直接承载非托管代码,再加上ILMerge对混合托管/非托管程序集的支持很差,这就导致了加载失败的问题。
具体解决方案
1. 优先改用纯托管的LZ4实现(最省心的方案)
非托管依赖在移动平台部署容易踩坑,建议直接替换为纯托管的LZ4库,比如LZ4.NET:
- 先卸载当前的lz4net包:
Uninstall-Package lz4net - 安装纯托管的LZ4.NET:
Install-Package LZ4.NET
这个库完全用C#实现,没有任何非托管依赖,完美适配Xamarin Forms项目。
2. 如果坚持使用lz4net,需手动配置平台项目的原生库
如果你必须保留lz4net,需要确保每个平台项目都正确部署LZ4cc原生库:
- Android项目:
- 下载对应ABI的
libLZ4cc.so文件(armeabi-v7a、x86、arm64-v8a等) - 在Android项目中创建
lib/[ABI]目录(比如lib/armeabi-v7a),将.so文件放入 - 右键.so文件→属性,设置生成操作为
AndroidNativeLibrary,复制到输出目录为始终复制
- 下载对应ABI的
- iOS项目:
- 获取对应架构的
libLZ4cc.a静态库 - 添加到iOS项目中,右键文件→属性,设置生成操作为
EmbeddedNativeLibrary
- 获取对应架构的
注意:PCL/.NET Standard库不能直接引用这些原生库,必须由平台项目承载。
3. 放弃ILMerge,改用更适配Xamarin的合并方案
ILMerge不支持合并包含非托管代码的程序集,建议替换为:
- Costura.Fody:自动嵌入所有依赖(包括非托管库),对Xamarin支持友好
- 安装包:
Install-Package Fody Install-Package Costura.Fody - 在项目根目录创建
FodyWeavers.xml,内容如下:<Weavers> <Costura /> </Weavers>
- 安装包:
4. 彻底清理项目缓存(比单纯删bin/debug更彻底)
有时候缓存的中间文件会导致奇怪的问题,按以下步骤操作:
- 右键解决方案→清理解决方案
- 手动删除所有项目的
bin和obj目录(不仅是PCL,还要包括Android/iOS项目) - 打开NuGet包管理器→管理解决方案的NuGet包→点击还原按钮,确保所有包都正确下载
- 最后右键解决方案→重建解决方案
5. 配置程序集绑定重定向(如果版本不匹配)
如果是版本不兼容导致的加载失败,可以在平台项目的配置文件中添加绑定重定向:
- 对于Android项目,在
Properties/AssemblyInfo.cs附近的配置中添加:
公钥令牌可以通过反编译工具查看<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="LZ4cc" publicKeyToken="你的公钥令牌" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-1.0.15.93" newVersion="1.0.15.93" /> </dependentAssembly> </assemblyBinding> </runtime>LZ4cc.dll的属性获取。
内容的提问来源于stack exchange,提问作者Kaizer69
相关产品推荐
相关产品推荐

