System.IO.dll有什么意义?

Dam*_*ver 18 .net .net-4.0

据我所知,大多数以下类型现在,并且一直在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))]
Run Code Online (Sandbox Code Playgroud)

所有指向mscorlib(我认为,没有检查所有这些).我看了一下,我看不到这些类型不在的任何框架版本(例如silverlight,compact等)mscorlib.那么,有没有人知道为什么这个集合存在(现在为什么)?

Han*_*ant 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命令中,这个想法太糟糕了.那些场景更加麻烦.只要构建的组件停留在同一台机器上,它就可以正常工作.但是,如果他们前往另一台机器,那就是安装了不同框架版本的机器.这可以产生非常神秘的运行时异常,这在Q + A中很明显.

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