2009-08-01 2 views
2

私は、C#で.NETアセンブリローダーを構築しています。これは、 "実験"/.NET内部操作の詳細を学ぶためです。私のようなタイプを導出することにより、リフレクションAPIを実装しました:なぜ `Assembly`と` Module`には公的に定義されたコンストラクタがありませんか?

  • RuntimeType:タイプ
  • RuntimeFieldInfo:のFieldInfo
  • RuntimeMethodInfo:METHODINFO
  • RuntimeParameterInfo:ParameterInfo
  • RuntimeConstructorInfo:ConstructorInfo
  • RuntimePropertyInfo: PropertyInfo

残念ながら、次は何の公的にアクセス可能なコンストラクタを持っていないので、私はトラブルを抱えているので、私はそれらから派生することはできません。

  • アセンブリ(密閉されていない - AssemblyBuilderが内部的に由来している)
  • モジュール(ではありません密封された - ModuleBuilderは内部

は私がRuntimeType.get_AssemblyRuntimeType.get_Moduleから戻るために何かを必要とする)ことに由来しています。提案?創造的になる - 私はしなければならなかった。 ;)RuntimeTypeHandleのインスタンスを作成するには、ポインタの安全でないキャストがジョブを完了させますが、ここではそれほど簡単ではありません。

これは特に問題ですが、ロードされたタイプのILをきれいに印刷しようとしています。構築されたジェネリックについては、Type.FullNameプロパティはAssemblyQualifiedNameプロパティを介した汎用パラメータを含み、Assemblyプロパティに依存します。

答えて

1

なぜあなたはそれらから派生できませんか?両方の型(アセンブリとモジュール)には、派生型で使用可能な保護されたコンストラクタがあります。型自体は公開されているため、実際の指定子よりも目立たないという問題はありません。

次のコードは、彼らがどんなpublicコンストラクタを持っていない理由として

public class MyAssembly : System.Reflection.Assembly { 
    public MyAssembly() : base() {} 
} 

だけで罰金をコンパイルします。私はこれについて直接的な知識は持っていませんが、人々がこれらのクラスから派生するように強制したかったのは明らかです。抽象的なメンバーがいないと考えると、奇妙に見えます。私が考えることができるのはバージョン管理の問題ですが、その背後にある論理は今は私の心に飛び込んでいません。

EDIT

私は私がチェック280Z28さんのコメントを読んで、はい、これは.NET 4.0に新しく追加された後。 4.0より前では、アセンブリとモジュールのコンストラクタは内部であり、どちらのタイプもコンクリートであったがシールされていませんでした。したがって、4.0より前の派生は、完全に信頼できるコードでいくつかの邪悪をしなければ、不可能です。

+0

これが当てはまる場合、.NET 4の新機能または.NET 2の後に削除されます。 –

+0

また、多くの種類の.NET Framework実装では*型から派生しています。しかし、 'Assembly'と' Module'型のために、それらはそのまま使用します。 –

+0

@ 280Z28、私はちょうど確認しました。 – JaredPar