在设计时解析程序集
不少人认为,通过“添加引用”对话框的“.NET”选项卡添加对程序集的引用时,将引用全局程序集缓存 (GAC) 中的程序集。 这种理解有误。 该引用实际上引用的是一个中间引用程序集,即,一个包含所有类型和签名信息但不一定包含任何代码的程序集。 “.NET”选项卡列出了与 .NET Framework 中的运行时程序集相对应的引用程序集。 此外,它还列出了与第三方使用的已注册 AssemblyFoldersEx 文件夹中的运行时程序集相对应的引用程序集。
多目标
Visual Studio 2010 可让您将在公共语言运行时 (CLR) 版本 2.0 或版本 4 上运行的多个 .NET Framework 版本作为目标。 这包括 .NET Framework 版本 2.0、3.0、3.5、4 和 Silverlight 版本 1.0、2.0、3.0。 如果发布基于 CLR 版本 2.0 或版本 4 的新的 .NET Framework 版本,则可以通过使用目标包来安装相应的 Framework,并且该 Framework 将在 Visual Studio 中自动显示为目标。 有关更多信息,请参见MSBuild 多目标功能。
类型解析的工作方式
在运行时,CLR 通过在 GAC 中、bin 目录中和任何探测路径中进行查找来解析程序集中的类型。 此操作将由合成加载程序处理。 但是,合成加载程序如何知道它要查找的内容呢? 在生成应用程序时,这将取决于设计时所进行的解析。
在生成过程中,编译器通过使用引用程序集来解析应用程序类型。 在 .NET Framework 版本 2.0、3.0 和 3.5 中,引用程序集将随 .NET Framework 一起安装。
在 .NET Framework 版本 4 中,引用程序集是由 .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) 列表。 这使得生成系统无法针对程序集的错误版本解析类型。