System.IO.dll有什么意义?

时间:2012-10-04 06:50:13

标签: .net-4.0 .net

据我所知,以下大多数类型现在都是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(我认为,尚未检查所有这些)。我已经浏览了一下,我看不到任何框架版本(例如silverlight,compact等),这些类型不在mscorlib中。那么,有没有人知道为什么这个集合存在(以及为什么现在)?

1 个答案:

答案 0 :(得分:10)

您找到了引用程序集。这可能听起来很奇怪,因为你肯定不会在.NET项目中使用这样的引用程序集,而.NET项目的目标是.NET> = 4.0。您通常从开发计算机上的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命令中,这个想法太糟糕了。那些场景更加麻烦。只要构建的组件停留在同一台机器上,它就可以正常工作。但是,如果他们前往另一台机器,那就是安装了不同框架版本的机器。这可能会产生非常神秘的运行时异常,在this Q+A中很明显。

System.IO.dll非常具有异国情调。当您使用对PCL程序集的引用运行System.CodeDom时,您只需要它。它的主要作用是隐藏声明,这种声明不应该在您选择的配置文件中使用。 System.IO命名空间需要隐藏,因为在您定位WinRT时无法使用这些类型。但是除了它不包含任何类型的原因之外,[TypeForwardedTo]告诉编译器桌面计算机上支持该类型并在其他地方查找声明,mscorlib.dll