从Azure DevOps 上获取了代码,生成失败。报错:CS0006:未能找到元数据文件
(后来发现,还存在CS2001:未能找到源文件 的错误 这也是解决生成失败问题的关键线索)
在网上找到了关于CS0006的问题的描述以及原理的分析和解决方案,如下:
(但是并不能解决我的问题)
现像:
解决方案重新生成,项目重新生成出现“错误 CS0006: 未能找到元数据文件”。
原因:
经过跟踪,MSBuild的机制是:
当重生新生成解决方案或项目时,生成项目会先清除输出目录下的全部生成文件(注意:是全部).然后copy obj目录下的生成文件到输出目录。
所以当某项目输出目录位于其它项目目录下,并且输出目录所在的项目输出目录也在本项目目录下.当重生新生成解决方案或输出目录所在的项目时会清除输出目录下的所有生成文件.这时当输出目录所在的项目对其它输出目录在本项目目录的项目存在依赖关系,那么当csc引用将会出现“错误 CS0006: 未能找到元数据文件”;.
经过测试,输出目录不在项目目录内时,生成项目只会清除自已的生成文件,而不会清除依赖项目生成文件。问题解决。
结论:
如果采用公用目录重新生成解决方案或项目并且项目间存在依赖关系,项目之间有依赖与被依赖关系时,输出目录不能位于依赖项目目录内。
另:
首先分析一下问题原因,在一个解决方案中不同项目之间的引用并不是仅仅添加引用就行了,还要添加项目依赖关系,需要注意的是两项目之间的引用只能是单向的,即不能相互引用,而依赖关系在你添加引用时vs会帮你自动完成依赖关系的添加。但是当你重新生成该项目(project)时,特定情况下就会出现这样的问题,引用还在,但是项目依赖没了,所以就会提示“未能找到元数据文件project(项目名).dll………………”
问题解决:上边分析了是项目依赖没有了,所以添加项目依赖就行了,右击该项目(project)-》生成依赖项-》项目依赖项,此处即可看到各项目的依赖关系,找到该项目(project),在没有打对勾的前面打对勾就可以了,最后重新生成解决方案,问题解决。
注意:如果查看依赖项也都没有问题,那就重新生成一下未找到元数据的项目,之后再重新生成一下解决方案就行了
最后我发现,问题的原因是我获取的不是最新的代码,同事提交了代码,我重新获取,生成,成功。不再报错了。
你如果也遇到了类似的问题,你要注意:
这个问题如果是和cs 2001:未能找到源文件 一起出现,
同时不是你一个人在使用这些代码,而是一个团队共同在使用这些代码,
你获取团队的代码,生成时出现上述问题,
如果在本地,在托管代码的服务器上相应的文件夹下都找不到缺失的源文件,
那么很可能是因为你获取的不是最新的代码,
和团队成员沟通一下,获取最新的代码可能问题自然就解决了。