C#:アセンブリ内のすべてのクラスを一覧表示する


103

アセンブリ内のすべてのクラスのリストを(プログラムで-C#で)出力したいと思います。

これを行うためのヒントまたはサンプルコードはありますか?反射?


プロジェクトで参照されていないアセンブリを調べることが目的である場合は、私の最新の回答を参照してください。
Thorarin

回答:


152

を使用しAssembly.GetTypesます。例えば:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
大規模なアセンブリに関する提案はありますか?13.8 MBのアセンブリに対してこのコードを実行すると、VSインスタンスが無期限に感じられるためにハングします。私は小さな9 KBのアセンブリを試してみましたが、問題なく動作しました。私はあなたが何を考えているのか知っています-なぜ13.8 MBのアセンブリがあるのですか-それはNetTeirsテンプレートを使用して生成された私のデータレイヤーの一部です。テーブルはたくさんあります。
dyslexicanaboko 14年

1
@dyslexicanaboko:型がたくさんある場合、それらをすべて列挙するには長い時間がかかります。あなたのアセンブリにはいくつのタイプありますか?そして、あなたは彼らと何をしていますか?(問題はタイプの抽出にあるのでしょうか、それとも後で何をしているのですか?)
Jon Skeet '28

asm.GetTypes()コールを通り抜けることができず、ハングするだけです-つまり、タイプがたくさんあるのは明らかです-それらをすべて取得しようとしてドリルダウンしているため、何もできません。CPUが4つのコアの1つで30%に達します。「ちょっと、この名前空間だけを見て」と言う方法があるのか​​と思っているだけなのですが、GetTypes()メソッドには空のコンストラクタしかないため、不可能だという印象を受けました。私は一種のオブジェクトブラウザを作ろうとしています。
dyslexicanaboko 14年

1
良い点、私はまだそれを試していません。私の現在の回避策は、asm.GetType(fullyQualifiedClassName)を使用してクラスを直接ターゲットにすることです-機能しますが、ユーザーにクラスのリストを表示することはできません。これはクライアント向けではなく、私自身と他の開発者のために内部的に使用しています。
dyslexicanaboko 14年

1
@DebugErr:はい-それはそれを作るための簡単な十分だだけのクラスあなたがしたい場合は、私の推測では、OPはおそらくということです、本当にすべての種類を望んでいました。
Jon Skeet

102

ジョンの例に追加したいのですが。独自のアセンブリへの参照を取得するには、以下を使用できます。

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection 名前空間。

参照していないアセンブリを調べる場合は、次のいずれかを使用できます。

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

見つけたタイプをインスタンス化する場合:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

詳細については、Assemblyクラスのドキュメントを参照してください。

Assemblyオブジェクトへの参照を取得したら、assembly.GetTypes()すでに説明したJonのように使用できます。


私のソリューションにある完全に異なるアセンブリをどのように参照できますか?
アレックス

13
私の例のように、最も簡単な方法はtypeof、そのアセンブリであることがわかっている型で使用し、次にAssemblyプロパティで使用することです。
ジョンスキート、

2
ソリューション内にあるアセンブリ(abc.dllなど)を参照する場合、dll名をハードコーディングしても問題がない場合、アセンブリを参照する別の方法は次のとおりです。 `Assembly assembly = Assembly.Load(" abc ");`
カシュ

現在のアセンブリのみをロードします。4つのDLLまたはプロジェクトを使用するアプリケーションまたはEXEがあります。これらのDLLのクラスの名前を取得するにはどうすればよいですか?
Er Mayank 2014

@JonSkeetこれは、「モダンな」C#環境でどのように実現できますか?UWP開発を行うときなど。UWPにはGetExecutingAssembly()メソッドがありません。
Daniel Armstrong
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.