18

据我所知,以下大多数类型现在并且一直是在mscorlib和/或中定义的System.dll

但是,在查看 v4 框架目录(我安装了 4.5,不确定它是否也存在于 Vanilla v4 中)时,我找到了一个名为System.IO.dll.

在反射器中检查它,我看不到任何实际代码。我能找到的只有以下条目:

[assembly: TypeForwardedTo(typeof(BinaryReader))]
[assembly: TypeForwardedTo(typeof(BinaryWriter))]
[assembly: TypeForwardedTo(typeof(EndOfStreamException))]
[assembly: TypeForwardedTo(typeof(FileNotFoundException))]
[assembly: TypeForwardedTo(typeof(InvalidDataException))]
[assembly: TypeForwardedTo(typeof(IOException))]
[assembly: TypeForwardedTo(typeof(MemoryStream))]
[assembly: TypeForwardedTo(typeof(SeekOrigin))]
[assembly: TypeForwardedTo(typeof(Stream))]
[assembly: TypeForwardedTo(typeof(StreamReader))]
[assembly: TypeForwardedTo(typeof(StreamWriter))]
[assembly: TypeForwardedTo(typeof(StringReader))]
[assembly: TypeForwardedTo(typeof(StringWriter))]
[assembly: TypeForwardedTo(typeof(TextReader))]
[assembly: TypeForwardedTo(typeof(TextWriter))]

所有都指向mscorlib(我认为,还没有检查所有这些)。我环顾四周,看不到这些类型不在mscorlib. 那么,有谁知道这个程序集为什么存在(为什么是现在)?

4

1 回答 1

10

您找到了一个参考程序集。这听起来可能很奇怪,因为您绝对不会在以 .NET >= 4.0 为目标的 .NET 项目中使用这样的参考程序集。您通常从开发机器上的 C:\Program Files (x86)\Reference Assemblies 目录中获取它们。但这不是使用编译器的唯一场景。当您在程序中使用 System.CodeDom 或依赖 XML 序列化时,您也会使用编译器。

System.CodeDom 和 XML 序列化的具体内容是编译器在您的用户机器上运行。而且您不能针对特定的 .NET Framework 版本。您的用户的机器没有您的机器具有的目标包。因此,它获取机器上恰好安装的任何版本。C:\Windows\Microsoft.NET\Framework\v4.0.30319 中的文件包含与已安装版本匹配的参考程序集。如果机器使用另一个 .NET 4.x 版本更新,那么这些参考程序集也会更新。

不是唯一可能的情况,您可能还会在从命令行构建时使用它们。或者在构建服务器上并决定不支付 VS 许可证,这是非常糟糕的主意。或者在 ILMerge 命令中,这是一个非常糟糕的主意。这些场景要麻烦得多。只要构建的组件位于同一台机器上,它就可以正常工作。但如果他们前往另一台机器,即安装了不同框架版本的机器,则不会。这会产生非常神秘的运行时异常,在这个 Q+A中很明显。

System.IO.dll 相当奇特。只有在引用 PCL 程序集运行 System.CodeDom 时才需要它。它的主要作用是隐藏声明,即不应该在您选择的配置文件中使用的那种。System.IO 命名空间需要隐藏,因为以 WinRT 为目标时无法使用这些类型。但除此之外,它不包含任何类型的原因,[TypeForwardedTo] 告诉编译器该类型在台式机上受支持,并在其他地方查找声明 mscorlib.dll

于 2012-10-04T13:28:08.707 回答