types是在未引用的程序集中定义的,如何find原因?

我知道这个错误信息很常见,关于这个错误还有很多问题,但是到目前为止还没有解决scheme帮助我,所以我决定提出这个问题。 与大多数类似的问题不同的是我使用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 

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

出于某种原因,应用程序不在App_Code目录中查找types。 由于我已经删除了Project.Rights.dll的所有实例(我知道),我不知道哪个程序集错误消息提及。

当你得到这个错误时,并不总是显而易见的,但正如错误所说 – 你错过了一个参考。 以下面这行代码为例:

 MyObjectType a = new MyObjectType("parameter"); 

它看起来很简单,你可能正确地引用了“MyObjectType”。 但是让我们说“MyObjectType”构造函数的重载之一是一个你没有引用的types。 例如有一个重载定义为:

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

至less有一种情况你会得到这个错误。 所以,在引用types的地方寻找这种types的模式,而不是所有types的属性或方法参数,这些属性或方法参数对于在该types上被调用的函数是可能的。

希望这至less能让你朝着正确的方向前进!

检查项目中的目标框架。

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

我相信,MS编译器可以更聪明,logging更有意义的错误信息。 我已经添加了一个build议https://github.com/dotnet/roslyn/issues/14756

在我的情况下,这是因为做一个NuGet包更新只更新了一些 dll依赖项的引用,但不是我的解决scheme中的所有项目 – 导致冲突的版本。 使用grep风格的工具在我的解决scheme中search* .csproj文件中的文本,很容易看到仍然需要更新的项目。

当你得到这个错误,这意味着你正在使用的代码引用一个在程序集中的types,但程序集不是你的项目的一部分,所以它不能使用它。

删除Project.Rights.dll是你想要的相反。 您需要确保您的项目可以引用程序集。 所以它必须放置在全局程序集caching或您的Web应用程序的〜/ Bin目录中。

编辑 – 如果你不想使用程序集,那么删除它也不是合适的解决scheme。 相反,您必须删除代码中的所有引用。 由于程序集并不是直接用你写的代码所需要的,而是由你所引用的其他东西来代替,所以你必须用没有Project.Rights.dll作为依赖的东西来replace那个被引用的程序集。

主要原因之一可能是DLL的属性,你必须先做任何事情来检查specific version property如果它真的使其为假

原因:在构build它时,可能是源代码与其他(旧)版本连接在一起,但是这个库升级了新的更新版本现在不同于Assembly Cash和你的应用程序禁止获得新的DLL,并且禁用specific version property你的掌声将可以自由获取新版本的DLL引用

这也意味着你可以使用一个库,它提供了库中定义的(公共)types。 即使你没有在你的图书馆中使用这些 (不是build立的)。

这可能阻止的是你编写的代码使用一个类(它的签名中有一个库中没有引用的types),你不能使用它。

我碰巧发现不同的项目引用了同一个dll的不同副本。 我确定所有引用的磁盘上的同一个文件,错误消失,因为我的预期。

对我来说,错误出现的原因是错误报告的WebForm已经从另一个文件夹中移出,但是它的代码文件类的名字保持不变,并且不对应于实际的path。

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

文件移动后:
文件path: /Folder1/MyWebForm.aspx.cs
代码文件类名称(不变,显示错误): Folder1_Subfolder1_MyWebForm

解决scheme:
重命名您的代码文件类Folder1_Subfolder1_MyWebForm
一个对应新pathFolder1_MyWebForm

所有一次 – 问题解决,没有错误报告..

在我的情况下,以上都没有工作。 事实certificate,引用的dll的版本实际上比我以前的版本更新。

我只需要回滚到以前的版本,并修复它。

types“Domain.tblUser”是在未引用的程序集中定义的。 您必须添加对程序集“域,版本= 1.0.0.0,文化=中立,PublicKeyToken = null”的引用。

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

注意:根据你的DI容器确定你的参考是正确的

在我的情况下,这是因为我使用

隐式运算符

BLLDAL类之间。当我想使用BLL Layer In Application Layer时,我得到了这个错误。 我变了

隐式运算符

显式操作符

这是可以的。 谢谢

也许你正在使用的库(DLL文件)需要另一个库。 在我的情况下,我引用了一个包含数据库实体模型的库 – 但我忘记引用entity framework库。

清理您的解决scheme并重build为我工作(在Visual Studio中,这些是您在解决scheme资源pipe理器中右键单击时所得到的选项),错误消失在我的项目中。