类型是在未引用的程序集中定义的,如何查找原因?


83

我知道错误消息很普遍,因此对此错误有很多疑问,但是到目前为止,还没有解决方案对我有帮助,所以我决定提出这个问题。与大多数类似问题的不同之处在于我使用App_Code目录。

错误信息:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

源文件:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

以下的建议在这里这里,我已经删除了C内Project.Rights.dll的所有实例:\ WINDOWS \ Microsoft.NET /*.*根据这个,我检查,如果有问题的.cs文件具有生成操作设置为“编译” 。他们是这样。我还仔细检查了包含“ Project.Rights.OperationsProvider”类型的.cs文件是否已部署到App_Code目录。

由于某种原因,应用程序不在App_Code目录中寻找类型。由于我已经删除了Project.Rights.dll的所有实例(据我所知),因此我不知道错误消息提到的程序集。


6
您正在使用一个类(例如A),该类公开了类型为Project.Rights.OperationsProvider的方法/属性/东西。编译器需要知道什么,然后它将搜索该程序集(Project.Rights)。如果找不到它(因为在您的网站项目中没有对它的引用)...您将收到此错误。解决方案:请勿从系统中删除该部件!!!添加对此的引用。
Adriano Repetti 2013年

2
尝试使用工具-选项-项目和解决方案-生成并运行-将详细程度都设置为“详细”。这将告诉您依赖项是什么,以及编译器在哪里寻找它。
danludwig 2013年

Answers:


99

当您收到此错误时,发生的情况并不总是很明显,但是正如错误所言-您缺少参考。以下面的代码行为例:

MyObjectType a = new MyObjectType("parameter");

它看起来很简单,您可能已经正确引用了“ MyObjectType”。但是,可以说“ MyObjectType”构造函数的重载之一采用了您未引用的类型。例如,有一个过载定义为:

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

至少有一种情况会出现此错误。因此,寻找这种类型的模式,在该模式中您已经引用了该类型,但并非所有类型的属性或方法参数都可以引用该类型的函数。

希望这至少能使您朝正确的方向前进!


16
关于扩展方法的注意事项:如果两个类的扩展方法具有相同的名称,则一种类型的参数可能会“感染”另一种类型的扩展方法。
Athari 2014年

@Athari谢谢你,我永远都不会想到这一点
Dave Cousineau

经过一段时间的观察,才偶然发现了这个答案。这正是我的问题,您的解释非常有帮助。谢谢负载。
黛安

1
但是,如果我不想将构造函数与引用一起使用怎么办?我想使用其他的,而不添加参考。看来这应该是可能的。
罗伯特·伊亚加尔

1
这似乎真的很奇怪,但是由于出现其中一个程序集名称不匹配(看起来像nuget区分大小写?)的情况,我出现了此错误!我有一个库C引用了库B和A。库B也引用了库A,但是使用名称'a'而不是'A'将A打包为依赖项。构建库C之前,我一直收到此错误,直到我更正了B中的依赖项名称!
托卢

49

检查项目中的目标框架。

在我的案例中,“您必须添加对程序集的引用”实际上意味着,调用者和引用项目没有相同的目标框架。调用者项目具有.Net 4.5,但引用的库具有目标4.6.1。

我敢肯定,MS编译器可以更智能,并记录更多有意义的错误消息。我向https://github.com/dotnet/roslyn/issues/14756添加了一个建议


16

在我的情况,这是因为做了NuGet包更新原本只更新到DLL依赖引用在一些,但不是所有的在我的解决方案项目-导致冲突版本。在我的解决方案中,使用grep样式的工具在* .csproj文件中搜索文本,可以轻松地看到仍需要更新的项目。


感谢您的回答-我认为这很接近,但很高兴看到它。换句话说,我的父项目(服务)在我的数据层中调用带有可选参数的构造函数时,尚未将该引用添加到.csproj中。比较子级文件和父级.csproj文件时,应显示出应该位于父级文件组中的ItemGroup。
Ryanman '17

3
解决方案的Visual Studio程序包管理器窗口(不适用于单个项目)具有“合并”选项卡,该选项卡显示在不同项目中哪些程序包具有不同的版本。它被证明比类似grep的工具更好
Michael Freidgeim

7

当您收到此错误时,表示正在使用的代码引用了程序集中的类型,但是该程序集不是项目的一部分,因此无法使用它。

删除Project.Rights.dll与您想要的相反。您需要确保您的项目可以引用程序集。因此,必须将其放置在Global Assembly Cache或Web应用程序的〜/ Bin目录中。

编辑-如果您不想使用该程序集,则删除它也不是正确的解决方案。相反,您必须在代码中删除对其的所有引用。由于您编写的代码并不直接需要该程序集,而是您要引用的其他程序直接需要该程序集,因此您必须用不具有Project.Rights.dll作为依赖项的内容替换该引用的程序集。


2
我不能使用该程序集,这是一个要求。我需要摆脱它,并将类存储在App_Code目录中。我知道这听起来如何,相信我。负责更改应用程序,以便将所有业务逻辑存储在App_Code而不是DLL中...这并不有趣。
afaf12 2013年

1
不,这意味着他使用的是带有引用的东西(不是他直接使用的东西)。@ afaf12如果必须摆脱它...则必须检查在使用它(将其想象为间接参考)。您不能简单地将代码粘贴到App_Code目录中,任何编译的程序集仍将引用原始的(和外部的)程序集…
Adriano Repetti 2013年

我也有类似经历,您的帖子对您​​有很大帮助。就我而言,我引用了一个程序集“ A”。该程序集正在使用另一个程序集“ B”。尽管我将程序集“ B”添加到我的项目中,但我不断收到该程序集缺失的错误。一旦将程序集“ B”复制到我的bin目录中,问题就解决了。原因是我的项目未使用程序集“ B”,但程序集“ A”正在使用,但未找到程序集,因此引发异常。谢谢。
ykh

4

就我而言,我所引用的库是为错误的平台/配置构建的(我刚刚创建了所引用的库)。

此外,我无法在Visual Studio配置管理器中解决此问题-无法为此库切换和创建新的平台和配置。我通过更正该项目文件ProjectConfigurationPlatforms部分中的条目来修复它.sln。它的所有排列都设置为Debug|Any CPU(我不确定如何做到)。我用一个正在工作的项目重写了损坏项目的条目,并更改了每个条目的GUID。

运作项目的条目

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

损坏项目的条目

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

损坏的条目现已修复

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

我希望这可以帮助别人。


对我来说,这是相似的。VIsual Studio已将我的某些项目的GUID从FAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C#)更改为9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET)。我把它们改回来后,一切进展顺利。
scor4er

3

我只是碰巧,不同的项目正在引用同一个dll的不同副本。我确保所有文件都引用了磁盘上的同一文件,并且该错误按照我的预期消失了。


1

当我尝试从.NET程序集选项卡添加引用时,它对我不起作用。但是,当我将带有BROWSE的引用添加到C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319时,它起作用了


0

主要原因之一可能是DLL的属性,您必须在做任何事情之前检查它specific version property是否为true使其变为false

原因:也许在构建源代码时将其与其他(旧)版本结合在一起,但是此库已通过新更新进行了升级,现在Assembly Cash中的版本有所不同,并且您的应用程序禁止获取新的DLL,并且在禁用之后, specific version property您的applacaten将免费获取新版本的DLL参考


0

也许您正在使用的库(DLL文件)需要另一个库。就我而言,我引用了一个包含数据库实体模型的库-但我忘记了引用实体框架库。


0

这也可能意味着您使用一个库,该库公开了库中定义的(公共)类型。即使您没有在库中专门使用这些库(没有构建的库)。

这可能会阻止您编写使用无法使用的类的代码(在其签名中具有未引用的库中的类型)。


0

对我来说,出现错误的原因是,已报告错误的WebForm已从另一个文件夹中移出,但其代码文件类的名称保持不变,并且与实际路径不符。

初始状态:
原始文件路径: /Folder1/Subfolder1/MyWebForm.aspx.cs原始代码文件
类名称: Folder1_Subfolder1_MyWebForm

移动
文件后:文件路径: /Folder1/MyWebForm.aspx.cs代码文件
类名(未更改,显示错误): Folder1_Subfolder1_MyWebForm

解决办法:
重命名你的CodeFile类Folder1_Subfolder1_MyWebForm
一个相应的新的路径Folder1_MyWebForm

一次-解决问题,无错误报告。


0

类型“ Domain.tblUser”在未引用的程序集中定义。您必须添加对程序集“ Domain,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”的引用。

**Solved:**
 Add reference of my domain library layer to my web app libary layer

注意:根据您的DI容器,确保引用正确



0

就我而言,所引用的dll版本实际上比我以前拥有的版本新。

我只需要回滚到以前的版本并进行修复即可。


0

对我来说,这是由项目直接和间接(通过另一个依赖项)导致的,该项目引用了具有不同程序集名称的两个不同版本的Bouncy Castle。Bouncy Castle构建之一是NuGet软件包,另一个是从GitHub下载的源的调试版本。两者都是名义上的版本1.8.1,但是GitHub代码的项目设置将程序集名称设置为BouncyCastle,而NuGet包的程序集名称为BouncyCastle.Crypto。更改项目设置,从而对齐程序集名称,可以解决此问题。


1
我建议您通过解释如何解决它来使您的答案更有用。
斯蒂芬·肯尼迪


0

我在使用现有项目的新创建解决方案中遇到了这个问题。由于某种原因,一个项目无法“看到”另一个项目,即使该项目与其他项目具有相同的引用,并且该引用的项目也在构建中。我怀疑它未能检测到与多个目标框架有关的事情,因为它是在一个框架中构建的,而不是在另一个框架中构建的。

清理和重建无效,并且重新启动VS无效。

最终的工作是打开“ VS 2019开发人员命令提示符”,然后发出msbuild MySolution.sln命令。这成功完成,之后VS也开始成功构建。


-3

清理您的解决方案并为我重建工作(在Visual Studio中,这些是在右键单击解决方案资源管理器时获得的选项),该错误在我的项目中消失了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.