C # : 어셈블리의 모든 클래스 나열


103

내 어셈블리의 모든 클래스 목록을 (프로그래밍 방식으로-C #) 출력하고 싶습니다.

이 작업을 수행하는 방법에 대한 힌트 또는 샘플 코드가 있습니까? 반사?


프로젝트에서 참조하지 않는 어셈블리를 검사하려는 경우 업데이트 된 답변을 참조하십시오.
Thorarin 2009-08-22

답변:


152

사용 Assembly.GetTypes. 예를 들면 :

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

1
대규모 어셈블리에 대한 제안 사항이 있습니까? 13.8MB 어셈블리에 대해이 코드를 실행하면 내 VS 인스턴스가 무기한 느낌이 들기 때문에 중단됩니다. 나는 작은 9KB 어셈블리를 시도했지만 잘 작동했습니다. 나는 당신이 생각하는 것을 알고 있습니다-왜 당신은 13.8 MB 어셈블리를 가지고 있습니까-NetTeirs 템플릿을 사용하여 생성 된 제 데이터 레이어의 일부입니다. 테이블이 많습니다.
dyslexicanaboko

1
@dyslexicanaboko : 유형이 많으면 모두 열거하는 데 오랜 시간이 걸립니다. 그래도 어셈블리 에는 몇 개의 유형 있습니까? 그리고 그들과 무엇을하고 있습니까? (당신에게 있는지 문제 유형을 추출하거나 당신이 나중에 일을하는지에?)
존 소총

asm.GetTypes () 호출을 통과 할 수 없습니다. 그냥 멈 춥니 다.-분명히 많은 유형이 있다는 사실을 의미합니다. 모든 유형을 가져 오려고 시도하기 때문에 아무것도 할 수 없습니다. . 내 CPU는 4 개 코어 중 하나에서 30 %까지 쏠립니다. 내 말은 "이봐-이 네임 스페이스 만 봐라"라고 말할 수있는 방법이 있는지 궁금한 것뿐입니다. GetTypes () 메서드에 빈 생성자 만 있기 때문에 불가능하다는 인상을 받았습니다. 일종의 개체 브라우저를 만들려고합니다.
dyslexicanaboko

1
좋은 지적은 아직 시도하지 않았습니다. 내 해결 방법은 asm.GetType (fullyQualifiedClassName)을 사용하여 클래스를 직접 대상으로 지정하는 것입니다. 작동하지만 사용자에게 클래스 목록을 표시하는 것은 불가능합니다. 이것은 btw를 향한 클라이언트가 아니며 내 자신과 다른 개발자를 위해 내부적으로 사용하고 있습니다.
dyslexicanaboko

1
@DebugErr : 예 - 그것을 쉽게 만들 충분 단지 클래스를 원하는 경우,하지만 내 생각은 영업 이익은 아마 것입니다 정말 모든 유형을 원했다.
Jon Skeet

102

Jon의 예에 추가하고 싶습니다. 자신의 어셈블리에 대한 참조를 얻으려면 다음을 사용할 수 있습니다.

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이 이미 설명한 것처럼 사용할 수 있습니다 .


내 솔루션에있는 완전히 다른 어셈블리를 어떻게 참조 할 수 있습니까?
Alex

13
가장 쉬운 방법은 typeof알고있는 유형 을 사용 하는 것 Assembly입니다. 내 예제 와 같이 해당 어셈블리와 속성을 차례로 사용하는 것입니다.
Jon Skeet

2
솔루션에있는 abc.dll과 같은 어셈블리를 참조하려는 경우, dll 이름을 하드 코딩해도 괜찮다면 어셈블리를 참조하는 또 다른 방법은 다음과 같습니다.`Assembly assembly = Assembly.Load ( "abc");`
Kash

현재 어셈블리 만로드합니다. 4 개의 dll 또는 프로젝트를 사용하는 응용 프로그램 또는 exe가 있습니다. 해당 dll의 클래스 이름을 어떻게 얻을 수 있습니까?
Er Mayank 2014-08-28

@JonSkeet "최신"C # 환경에서 어떻게이 작업을 수행 할 수 있습니까? UWP 개발과 같은 경우. UWP에는 GetExecutingAssembly () 메서드가 없습니다.
다니엘 암스트롱
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.