据我所知,下面的大多数类型现在和过去都是在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
中没有这些类型。那么,有没有人知道这个程序集存在的原因(为什么是现在)?
发布于 2012-10-04 21:28:09
您找到了引用程序集。这听起来可能有点奇怪,因为您绝对不会在面向.NET >= 4.0的.NET项目中使用这样的引用程序集。通常,您可以从开发机器上的C:\Program Files (x86)\Reference Assemblies目录中获取它们。但这并不是使用编译器的唯一场景。当您在程序中使用System.CodeDom或依赖于XML序列化时,也可以使用编译器。
关于System.CodeDom和XML序列化的特定之处在于编译器在用户的机器上运行。并且您不能以特定的.NET框架版本为目标。您的用户计算机没有您的计算机所具有的目标包。因此,无论机器上安装的是哪个版本,它都会获取。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
https://stackoverflow.com/questions/12721757
复制相似问题