无法加载文件或程序集'System.IO.FileSystem ...'

时间:2017-07-31 20:49:03

标签: c# .net .net-standard

我正在使用.NET Standard 1.3和.NET Framework 4.6。

最重要的是,我正在尝试从System.IO.FileSystem访问这些类:

Directory class (i.e. Directory.Delete();)
File class (i.e. File.Exists();)
FileInfo class (i.e. FileInfo fi = new FileInto();)

但我总是得到如下错误:

  

无法加载文件或程序集'System.IO.FileSystem,   Version = 4.0.1.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或   其中一个依赖项。定位程序集的清单定义   与装配参考不匹配。 (HRESULT的例外情况:   0x80131040)

我已经为.NET Standard 1.3库安装了System.IO.FileSystem 4.3.0。

我尝试删除bin文件,清理,重建,恢复nuget包,编辑.csproj文件等.Nada。

2 个答案:

答案 0 :(得分:1)

删除参考文献下的参考文献。

转到您的包文件夹并在任何包中搜索该程序集 寻找任何令人讨厌的错误版本的程序集。如果找到它,那么你可以看到它被拉入的nuget包。如果您发现版本错误,请进入VS并从所有项目中卸载该nuget包。

另一个故障排除步骤是以XML格式打开项目文件并查找Reference标记。通常有一个像这样的HintPath会让你知道违规包或硬引用。 (通过“冒犯”,我的意思是允许我们确定它在哪里找到错误的不兼容版本的程序集)

<HintPath>..\packages\Microsoft.Bcl.1.1.10\lib\net40\System.IO.dll</HintPath>

这是在添加程序集时使用“浏览”选项的人找到错误的硬编码路径的方法,这在处理BCL程序集时是一种不好的做法。

注意我此时从不编辑项目文件以重新引用引用。这只是为了弄清楚罪犯在哪里并删除包或坏程序集,如果另一个开发人员已经检查了二进制文件到解决方案(BCL库的另一种可怕的做法)。

Clean + Rebuild,它应该被破坏,因为没有汇编引用。

此时我已经清除了错误的引用。以前我会使用Add Reference - &gt;并从框架部分中选择。这基本上是GAC参考。

这些天我现在得到了相应的nuget包,它应该根据你的目标框架添加正确的引用,你可以明确地选择你想要的程序集的版本,只需确保你的解决方案中的所有相关项目都使用相同的版本以避免问题: https://www.nuget.org/packages/System.IO/

这可能很难解决,因为它们通常不是单个程序集的官方程序包,而是包含在一个名为Microsoft.BCL或Microsoft.AspNet.WebAPI.Client的大型程序包中(我已经习惯了得到Http程序集)。这是我发现最困难的部分,但看起来上面的链接应该为您提供所需的特定版本(希望如此)。

安装nuget包应该立即添加对项目的引用(这就是我们删除任何其他引用以防止添加正确引用的原因)。仔细检查“输出”选项卡和各种“显示输出:”部分,以确保在nuget安装期间没有错误。

这些天大部分都是通过nuget包引入的,以使所有相关项目的版本同步。老实说,我不明白为什么当他们成为已安装框架的一部分时,为什么现在通过Nuget引入BCL类,但这就是现在看待事情的方式以及我让它们始终如一地工作的方式。

答案 1 :(得分:0)

就我而言,我为我的实际项目(项目 B)创建了测试项目(比如项目 A)。 当我运行测试时,项目 A 构建成功,但是当我运行测试时,我遇到了类似的错误。 System.IO.Ports 已安装在项目 B 上,但未安装在测试项目 A

通过在两个项目上安装 System.IO.Ports 包解决的问题解决了问题。