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

afa*_*f12 66 .net c# asp.net asp.net-4.0

我知道错误信息是常见的,关于这个错误有很多问题,但到目前为止还没有解决方案帮助我,所以我决定提出这个问题.与大多数类似问题的区别在于我使用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'.
Run Code Online (Sandbox Code Playgroud)

源文件:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs
Run Code Online (Sandbox Code Playgroud)

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

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

dre*_*w_w 89

当你得到这个错误时,并不总是很明显发生了什么,但正如错误所说 - 你错过了一个引用.以下面的代码行为例:

MyObjectType a = new MyObjectType("parameter");
Run Code Online (Sandbox Code Playgroud)

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

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}
Run Code Online (Sandbox Code Playgroud)

这至少是一种你会得到这个错误的情况.因此,寻找这种类型的模式,其中您引用了类型,但没有引用该类型上调用的函数可能的所有属性类型或方法参数.

希望这至少可以让你朝着正确的方向前进!

  • 关于扩展方法的注意事项:如果两个类具有相同名称的扩展方法,则一种类型的参数可以"感染"扩展方法与另一种类型的使用. (14认同)
  • 但是如果我不想使用带有引用的构造函数怎么办?我想使用其他的,而不添加引用。看起来这应该是可能的。 (2认同)

MiF*_*vil 41

检查项目中的目标框架.

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

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


rog*_*ito 14

在我的情况下,这是因为执行NuGet包更新只更新了对我的解决方案中某些不是所有项目中的dll依赖项的引用- 导致版本冲突.使用grep风格的工具在我的解决方案中的*.csproj文件中搜索文本,然后很容易看到仍需要更新的项目.

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

mas*_*son 7

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

删除Project.Rights.dll与您想要的相反.您需要确保您的项目可以引用程序集.因此,它必须放在全局程序集缓存或Web应用程序的〜/ Bin目录中.

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

  • 我不能使用组件,这是一个要求.我需要摆脱它并将类存储在App_Code目录中.我知道这听起来如何,相信我.负责更改应用程序,以便所有业务逻辑都存储在App_Code而不是DLL中......并不好玩. (2认同)