我在一个WPF, c# 3.0项目上工作,我得到了这个错误:

Error 1 Metadata file
'WORK=- \Tools\VersionManagementSystem\BusinessLogicLayer\bin\Debug
\BusinessLogicLayer.dll' could not be found C:\-=WORK=- \Tools
\VersionManagementSystem\VersionManagementSystem\CSC VersionManagementSystem

这是我如何引用我的usercontrols:

xmlns:vms="clr-namespace:VersionManagementSystem"
<vms:SignOffProjectListing Margin="5"/>

每次构建失败后都会发生这种情况。我能得到解决方案编译的唯一方法是注释掉所有用户控件并重新构建项目,然后取消注释用户控件,一切正常。

我已经检查了构建顺序和依赖项配置。

正如你所看到的,它似乎截断了DLL文件的绝对路径…我读到过关于长度的问题。这是一个可能的问题吗?

注释、构建和取消注释是非常烦人的,构建变得非常烦人。


当前回答

我的问题实例是由一个公共项目引起的,该项目中有重复的类名(在不同的文件名下)。奇怪的是,Visual Studio无法检测到这一点,而只是破坏了构建过程。

其他回答

对我来说,问题是在构建输出中没有出现的错误,也就是说,我有两个实用程序类最初在不同的名称空间中。我更改了第二个类的名称空间以匹配第一个类(不知道第一个类中还有另一个实用程序类),这时就出现了这个错误。

我认为构建输出错误浮出了表面,因为逻辑层库DLL文件无法构建,而主应用程序无法找到它。

解决方案是将第二个实用程序类改回一个不同的名称空间,这时才开始出现真正的构建错误。在对它们进行整理之后,构建就顺利进行了。

总的来说,如果前面的任何解决方案对您不起作用,您可能已经抑制了Visual Studio没有显示的代码中的错误,因此尝试重新跟踪您的编码步骤并检查任何不规则情况。

PS:这是Visual Studio 2015社区版

对我来说,它试图在曾经包含项目的路径中找到一个DLL,但我们已经将它移动到一个新目录。解决方案有通往项目的正确路径,但Visual Studio不知何故一直在旧位置寻找。

解决方案:将每个问题重命名为项目-只需添加一个字符或其他-然后重命名为原来的名称。

这必须在Visual Studio中重置某种类型的全局缓存,因为这会清除这个问题和其他类似的问题,而Clean之类的东西则不会。

到目前为止,这几十个答案中没有一个对我有用。在我的情况下,我也得到了错误:

元组元素名称“Value”被推断出来。请使用语言版本7.1或更高的版本通过推断的名称访问元素

这出现在构建时“元数据文件'.dll'找不到”错误旁边,但它很快就消失了,因为错误有时会在IDE“赶上”。

双击错误以找到它,并删除有问题的代码,修复它。

否则,你可以在Visual Studio中试试这个:

菜单项目→<项目名称>属性→构建→按钮高级→语言版本→c# <最新小版本>(例如:“c# 5.0”)

这也能解决问题。

看起来“元数据文件“.dll”无法找到”通常是一些其他潜在问题的症状,因此,如果没有一个顶级解决方案对您有效,请检查其他错误和警告,并尝试找到真正的问题。

当我试图发布一个web应用程序时,我遇到了这个错误。原来一个类属性被包装成

#if DEBUG
    public int SomeProperty { get; set; }
#endif

但是财产的使用却不是这样。显然,发布是在没有DEBUG符号的发布配置中完成的。

在我的案例中,ReSharper是愚蠢的,即使我的项目目标是c# 6,我也被提供了重构来使用c# 7独有的特性。

出于这个原因,我最终修改了这段代码,

private DateTime? _joinedDate;
[Column(TypeName = "DateTime2")]
public DateTime JoinedDate
{
    get { return _joinedDate ?? DateTime.Now; }
    set { _joinedDate = value; }
}

进入这段代码:

private DateTime? _joinedDate;
[Column(TypeName = "DateTime2")]
public DateTime JoinedDate
{
    get => _joinedDate ?? DateTime.Now;
    set => _joinedDate = value;
}

由于某种原因,让getter和setter使用表达式体使编译器产生元数据错误而不是语法错误。