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 コマンドでは、非常に悪い考えです。これらのシナリオは、はるかに面倒です。ビルドされたアセンブリが同じマシン上にある限り、問題なく動作します。ただし、異なるフレームワーク バージョンがインストールされている別の 1 台のマシンに移動する場合はそうではありません。この Q+Aで明らかなように、非常に不可解な実行時例外が発生する可能性があります。

System.IO.dll はかなり風変わりです。PCL アセンブリへの参照を使用して System.CodeDom を実行する場合にのみ必要になります。その主な役割は、選択したプロファイルで使用されるべきではない種類の宣言を非表示にすることです。System.IO 名前空間は、WinRT を対象とする場合はこれらの型を使用できないため、非表示にする必要があります。しかし、それ以外の場合、型が含まれていないという理由で、[TypeForwardedTo] は、その型がデスクトップ コンピューターでサポートされていることをコンパイラに伝え、他の場所で宣言 mscorlib.dll を探すように指示します。

于 2012-10-04T13:28:08.707 に答える