类型 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中见过这种错误。为什么编译器找不到在依赖项引用的程序集中定义的类型?

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

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

想一想:

您已经创建了一个完美的漂亮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任务也会找到所需的程序集,而您不必引用它。