Mono环境已引用System.Xml.Linq仍报XElement未引用错误求助
错误根因分析
- 程序集版本不匹配:你引用的外部正常项目dll编译时依赖的
System.Xml.Linq程序集版本,和你当前mod项目引用的System.Xml.Linq版本不一致。第一行直接定义XElement变量不报错,是因为本地代码可以直接匹配你当前项目引用的程序集版本,而调用外部方法时会校验参数类型绑定的原始程序集版本,找不到对应版本就会触发未引用报错。 - 缺少程序集绑定重定向:Mono环境下msbuild默认不会自动生成绑定重定向,就算你本地引用了更高版本的
System.Xml.Linq,也不会自动把外部dll依赖的低版本引用定向到高版本。 - 目标框架不兼容:你当前mod项目的目标框架版本和外部dll的编译目标框架不一致,导致两者依赖的
System.Xml.Linq来自不同的框架实现。 - 程序集引用属性异常:你引用的
System.Xml.Linq没有开启复制本地,运行时加载的版本和编译期预期版本不符。
解决方案
- 核对统一引用版本
用反编译工具查看外部dll依赖的System.Xml.Linq的版本号、公钥Token,然后在你当前项目的csproj里指定引用完全一致的版本,示例配置:
<Reference Include="System.Xml.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <Private>True</Private> </Reference>
- 强制启用自动绑定重定向
在你的csproj的第一个<PropertyGroup>节点中添加如下配置:
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
编译后会生成和mod dll同名的.config文件,将该文件放到mod运行目录即可。
3. 对齐目标框架版本
确认外部dll的编译目标框架,将你的mod项目的目标框架修改为完全一致的版本。
4. 清理缓存重新编译
执行如下命令清理缓存后重新编译:
msbuild /t:Clean rm -rf obj bin msbuild /t:Build
内容的提问来源于stack exchange,提问作者nome criativo
相关产品推荐
相关产品推荐

