簡単な答えは、いいえ、あなたが求めていることをする方法はありません。
より長い答えはこれです:Assembly.ReflectionOnlyLoad()
「反射のみ」のロードコンテキストを使用する特別なアセンブリロードメソッドがあります。これにより、実行できないアセンブリをロードできますが、メタデータを読み取ることはできます。
あなたの場合(そして、明らかに、私が自分で思いつく可能性のあるすべてのユースケースで)、それは実際にはそれほど役に立ちません。この種のアセンブリから型付き属性を取得することはできません。。のみCustomAttributeData
です。そのクラスは、特定の属性をフィルタリングするための良い方法を提供していません(私が思いついた最善の方法は、それを文字列にキャストして使用することでしたStartsWith("[System.Diagnostics.Debuggable");
さらに悪いことに、リフレクションのみのロードでは依存関係アセンブリはロードされませんが、手動でロードする必要があります。それはあなたが今していることよりも客観的にそれを悪化させます。少なくとも今は、依存関係が自動的に読み込まれます。
(また、私の以前の回答はMEFに言及していました。私は間違っていました。これを機能させるために、MEFには大量のカスタムリフレクションコードが含まれているようです。)
最終的に、一度ロードされたアセンブリをアンロードすることはできません。このMSDNの記事で説明されているように、アプリドメイン全体をアンロードする必要があります。
アップデート:
コメントに記載されているように、リフレクションのみのロード(および通常のロード)を介して必要な属性情報を取得できましたが、型指定された属性メタデータがないため、深刻な問題が発生します。
通常のアセンブリコンテキストにロードすると、必要な情報を簡単に取得できます。
var d = a.GetCustomAttributes(typeof(DebuggableAttribute), false) as DebuggableAttribute;
var tracking = d.IsJITTrackingEnabled;
var optimized = !d.IsJITOptimizerDisabled;
リフレクションのみのコンテキストにロードすると、いくつかの作業を行うことができます。属性コンストラクターがとった形式を理解し、デフォルト値が何であるかを理解し、その情報を組み合わせて各プロパティの最終値を作成する必要があります。次のように必要な情報を取得します。
var d2 = a.GetCustomAttributesData()
.SingleOrDefault(x => x.ToString()
.StartsWith("[System.Diagnostics.DebuggableAttribute"));
そこから、ConstructorArguments
どのコンストラクターが呼び出されたかを確認する必要があります。これは1つの引数を持つか、これは2つの引数を持つものです。次に、適切なパラメータの値を使用して、関心のある2つのプロパティが取得した値を把握できます。
if (d2.ConstructorArguments.Count == 1)
{
var mode = d2.ConstructorArguments[0].Value as DebuggableAttribute.DebuggingModes;
// Parse the modes enumeration and figure out the values.
}
else
{
var tracking = (bool)d2.ConstructorArguments[0].Value;
var optimized = !((bool)d2.ConstructorArguments[1].Value);
}
最後に、NamedArguments
たとえば次を使用して、コンストラクターで設定されたものをオーバーライドする可能性があるかどうかを確認する必要があります。
var arg = NamedArguments.SingleOrDefault(x => x.MemberInfo.Name.Equals("IsJITOptimizerDisabled"));
var optimized = (arg == null || !((bool)arg.TypedValue.Value));
DebuggingModes
最後に、これを.NET 2.0以降で実行していて、まだ見たことがない場合、MSDNはドキュメントでこれを指摘しています。
.NET Frameworkバージョン2.0では、JIT追跡情報は常に生成されます。このフラグは、IsJITTrackingEnabledプロパティがfalseである点を除いて、デフォルトと同じ効果があります。これは、バージョン2.0では意味がありません。