在设计时解析程序集

不少人认为,通过“添加引用”对话框的“.NET”选项卡添加对程序集的引用时,将引用全局程序集缓存 (GAC) 中的程序集。这种理解有误。该引用实际上引用的是一个中间引用程序集,即,一个包含所有类型和签名信息但不一定包含任何代码的程序集。“.NET”选项卡列出了与 .NET Framework 中的运行时程序集相对应的引用程序集。此外,它还列出了与第三方使用的已注册 AssemblyFoldersEx 文件夹中的运行时程序集相对应的引用程序集。

多目标

Visual Studio 2012 可让您将在公共语言运行时 (CLR) 版本 2.0 或版本 4 上运行的多个 .NET Framework 版本作为目标。这包括 .NET framework 2.0 版中,版本 3.0,3.5,4 和 4.5 和 Silverlight 1.0 版中,版本 2.0 和 3.0 版。如果发布基于 CLR 版本 2.0 或版本 4 的新的 .NET Framework 版本,则可以通过使用目标包来安装相应的 Framework,并且该 Framework 将在 Visual Studio 中自动显示为目标。

类型解析的工作方式

在运行时,CLR 通过在 GAC 中、bin 目录中和任何探测路径中进行查找来解析程序集中的类型。此操作将由合成加载程序处理。但是,合成加载程序如何知道它要查找的内容呢?在生成应用程序时,这将取决于设计时所进行的解析。

在生成过程中,编译器通过使用引用程序集来解析应用程序类型。在 .NET framework 程序集引用,即使安装,版本 2.0,3.0 版,版本 3.5,4 版和 4.5 版中,安装 .NET framework。

在 .NET Framework 版本 4.5 中,引用程序集是由 .NET Framework SDK 的对应版本附带的目标包提供的。Framework 自身仅提供运行时程序集。若要生成应用程序,您需要安装 .NET Framework 和对应的 .NET Framework SDK。

当以特定的 .NET Framework 为目标时,生成系统将通过使用目标包中的引用程序集来解析所有类型。在运行时,合成加载程序将这些类型解析到运行时程序集,这些运行时程序集通常位于 GAC 中。

如果引用程序集不可用,则生成系统会通过使用运行时程序集来解析程序集类型。因为 GAC 中的运行时程序集不能通过次版本号加以区分,所以有可能会解析到错误的程序集。例如,如果在以版本 3.0 为目标时引用 .NET Framework 版本 3.5 中引入的新方法,则可能会出现此情况。生成将成功,并且应用程序将在生成计算机上运行,但是在将其部署到未安装版本 3.5 的计算机上时将失败。

.NET Framework SDK 现在附带的目标包包括相应的 Framework 版本中的所有运行时程序集的列表,此列表称为再发行 (redist) 列表。这使得生成系统无法针对程序集的错误版本解析类型。

请参见

其他资源

MSBuild 高级概念