.NET Core与.NET Framework XmlDocument跨平台兼容问题求助
解决.NET 4.5.2应用引用.NET Core 2.0类库时XmlDocument类型不匹配的问题
这个问题我之前也碰到过,本质是**.NET Framework和.NET Core中XmlDocument的程序集归属不一致**导致的类型兼容问题:
- 在.NET 4.5.2里,
XmlDocument定义在System.Xml.dll中 - 在.NET Core 2.0里,它被迁移到了
System.Xml.ReaderWriter.dll中
CLR会把来自不同程序集的同名类型视为完全独立的类型,所以当你的.NET 4.5.2应用试图接收Core类库返回的XmlDocument实例时,就会出现找不到类型定义的错误。
下面是几个不需要依赖NuGet的可行解决方案:
方案1:改用跨框架兼容的XML类型
最简单的方式是替换成XDocument(LINQ to XML的核心类型),它在.NET Framework 4.5.2和.NET Core 2.0中都有一致的程序集归属,天然兼容。你可以在Core类库中完成XmlDocument到XDocument的转换,应用端按需转回即可:
修改后的Core 2.0类库代码
using System.Xml; using System.Xml.Linq; namespace TestCoreXmlDoc { public class Class1 { public static XDocument DoAThing() { XmlDocument libDoc = new XmlDocument(); libDoc.LoadXml("<root></root>"); // 将XmlDocument转换为XDocument return XDocument.Load(libDoc.CreateNavigator().ReadSubtree()); } } }
修改后的.NET 4.5.2应用代码
using System.Xml; using System.Xml.Linq; namespace ConsoleAppTextXmlDoc { class Program { static void Main(string[] args) { XDocument xDoc = TestCoreXmlDoc.Class1.DoAThing(); // 如果需要继续使用XmlDocument,再转换回去 XmlDocument appDoc = new XmlDocument(); using (var reader = xDoc.CreateReader()) { appDoc.Load(reader); } // 后续正常操作appDoc即可 } } }
方案2:给Core类库做多目标编译
如果你不想修改类库的业务逻辑,可以让类库同时针对.NET 4.5.2和.NET Core 2.0编译,生成两个版本的dll,应用直接引用.NET 4.5.2版本即可:
- 打开Core类库的
.csproj文件 - 将原来的单目标配置
<TargetFramework>netcoreapp2.0</TargetFramework>替换为多目标配置:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net452;netcoreapp2.0</TargetFrameworks> </PropertyGroup> </Project>
- 重新编译类库,你会在
bin/Debug目录下看到net452和netcoreapp2.0两个子文件夹,各自对应不同框架的dll - 让你的.NET 4.5.2应用引用
net452文件夹下的dll,此时返回的XmlDocument就是.NET Framework 4.5.2原生类型,完全兼容
不推荐的方案:手动引用Core的System.Xml.ReaderWriter.dll
虽然你可以尝试在.NET 4.5.2应用中手动添加对.NET Core 2.0版本System.Xml.ReaderWriter.dll的引用,但这种做法很容易引发兼容性问题(比如两个框架下XML处理行为的差异),除非万不得已,不建议这么做。
内容的提问来源于stack exchange,提问作者Broots Waymb
相关产品推荐
相关产品推荐

