键入Foo不在引用的程序集中,但我使用类型Bar扩展类型Foo

时间:2013-10-10 06:46:21

标签: c# .net entity-framework

以下代码行会产生错误:

private MyContext context;

错误:

The type 'System.Data.Entity.DbContext' is defined in an assembly that is not referenced.

MyContext扩展了DbContext,MyContext在引用的程序集中定义。我从未在Java中看到过这种错误。 为什么编译器找不到依赖项引用的程序集中定义的类型?

2 个答案:

答案 0 :(得分:1)

因为该程序集可能不存在。

想一想:

您已经创建了一个与COM端口配合使用的完美不错的DLL A 。但是,它引用某种System.IO.Comports.dll库来按预期工作。

然后,有人想要使用 A 库并引用它。他怎么知道项目或bin文件夹或system32目录中存在System.IO.Comports.dll库?或者在哪里寻找它?没有“有人”正在开发的EXE项目的直接引用。

直接引用总是被复制到输出目录,除了预先安装的引用 - 比如.NET Framework - 以确保可执行文件能够找到它们。

  

“System.Data.Entity.DbContext”类型在未引用的程序集中定义。

此类型可能在具有多个版本的多个库中定义,并且visual studio无法查找每个类型以检查它是否与所需版本匹配 - 这就是项目需要直接引用的原因,这就是为什么。几乎所有 .net的DLL仅引用自己,不会因为额外的引用而烦扰您。

答案 1 :(得分:0)

因为编译器必须查看存储在其程序集中的类型信息,所以如果他找不到程序集,则抛出此错误。

如果引用了程序集,它将被复制到输出目录,编译器将能够找到它。此外,如果所需的程序集在GAC中,编译器将找到它。

有时在ResolveAssemblyReference之前运行的MSBuild C# compiler任务也会找到所需的程序集,您不必参考它。