类型 Foo 不在引用的程序集中,但我使用的是扩展类型 Foo 的类型 Bar
本文关键字:类型 Foo Bar 扩展 集中 引用 程序 程序集 | 更新日期: 2023-09-27 18:34:38
以下代码行产生错误:
private MyContext context;
错误:
The type 'System.Data.Entity.DbContext' is defined in an assembly that is not referenced.
MyContext
扩展了 DbContext,MyContext
在引用的程序集中定义。我从未在Java中见过这种错误。为什么编译器找不到在依赖项引用的程序集中定义的类型?
因为该程序集可能不存在。
想一想:
您已经创建了一个完美的漂亮DLL A,它适用于COM端口。但是,它引用某种System.IO.Comports.dll
库以完全按预期工作。
然后,有人想要使用您的 A 库并引用它。他应该如何知道System.IO.Comports.dll
库存在于项目或 bin 文件夹或 system32 目录中?或者在哪里寻找它?没有直接引用"某人"正在开发的EXE项目。
直接引用始终复制到输出目录,但预安装的引用(如 .NET Framework 的(除外,以确保可执行文件能够找到它们。
类型"System.Data.Entity.DbContext"是在未引用的程序集中定义的。
此类型可能在具有多个版本的多个库中定义,Visual Studio 无法查找每个库来检查它是否与所需的版本匹配 - 这就是为什么项目需要具有直接引用的原因,这就是为什么几乎所有 .net 的 DLL 仅引用自身,以免打扰您进行其他引用。
由于编译器必须查看存储在其程序集中的类型信息,因此如果找不到程序集,则会引发此错误。
如果引用程序集,它将被复制到输出目录,编译器将能够找到它。此外,如果所需的程序集位于GAC
编译器将找到它。
有时,在C# compiler
之前运行的ResolveAssemblyReference
MSBuild
任务也会找到所需的程序集,而您不必引用它。