로드 된 모든 어셈블리를 어떻게 나열합니까?


101

.Net에서 모든 AppDomain에 대해로드 된 모든 어셈블리를 열거하고 싶습니다. 내 프로그램의 AppDomain에 대해 수행하는 것은 충분히 쉽습니다 AppDomain.CurrentDomain.GetAssemblies(). 어떻게 든 모든 AppDomain에 액세스해야합니까? 아니면 이미이를 수행하는 도구가 있습니까?


1
참고 GetAssemblies()가 재귀 아니므로, 작동하지 않습니다하고 중첩 된 어셈블리 참조를 그리워합니다. 나는의 재귀 버전을 추가했습니다 GetAssemblies()stackoverflow.com/questions/383686/... .
Contango

@Contango : AppDomain.CurrentDomain.GetAssemblies()완벽합니다. 처음에 참조를 열거하지 않기 때문에 참조를 재귀 적으로 걸을 필요가 없습니다.
Ben Voigt

이것이 귀하의 질문에 대답합니까? 현재로드 된 어셈블리를 어떻게 반복합니까?
UuDdLrLrSs

답변:


95

Visual Studio 사용

  1. 프로세스에 디버거 연결 (예 : 디버깅으로 시작 또는 디버그> 프로세스에 연결)
  2. 디버깅하는 동안 모듈 창을 표시합니다 (디버그> Windows> 모듈).

이는 각 어셈블리, 앱 도메인에 대한 세부 정보를 제공하며 심볼을로드하는 몇 가지 옵션 (예 : 디버그 정보가 포함 된 pdb 파일)이 있습니다.

여기에 이미지 설명 입력

Process Explorer 사용

외부 도구가 필요한 경우 Process Explorer (Microsoft에서 게시 한 프리웨어)를 사용할 수 있습니다.

프로세스를 클릭하면 사용 된 모든 어셈블리 목록이 표시됩니다. 이 도구는 파일 핸들 등과 같은 다른 정보를 보여주기 때문에 꽤 좋습니다.

프로그래밍 방식

그것을 수행하는 방법을 설명하는 이 SO 질문을 확인하십시오 .


1
프로세스의 속성 페이지에서 Process Explorer는로드 된 AppDomain ( '공유 도메인'포함) 어셈블리를 정확히 표시하기 때문에 여기에 설명 된 것보다 훨씬 좋습니다. 따라서 프로세스에로드 된 .dll 이상의 것을 보여줍니다. 이를 표시하기 위해 어떤 API를 사용하는지 아는 것이 좋습니다 ( '프로그래밍 방식'링크는 CurrentDomain의 어셈블리를 제공합니다).
Govert

22

여기에 내가 끝낸 것입니다. 모든 속성과 메서드의 목록이며 각 메서드에 대한 모든 매개 변수를 나열했습니다. 나는 모든 가치를 얻는 데 성공하지 못했습니다.

foreach(System.Reflection.AssemblyName an in System.Reflection.Assembly.GetExecutingAssembly().GetReferencedAssemblies()){                      
            System.Reflection.Assembly asm = System.Reflection.Assembly.Load(an.ToString());
            foreach(Type type in asm.GetTypes()){   
                //PROPERTIES
                foreach (System.Reflection.PropertyInfo property in type.GetProperties()){
                    if (property.CanRead){
                        Response.Write("<br>" + an.ToString() + "." + type.ToString() + "." + property.Name);       
                    }
                }
                //METHODS
                var methods = type.GetMethods();
                foreach (System.Reflection.MethodInfo method in methods){               
                    Response.Write("<br><b>" + an.ToString() + "."  + type.ToString() + "." + method.Name  + "</b>");   
                    foreach (System.Reflection.ParameterInfo param in method.GetParameters())
                    {
                        Response.Write("<br><i>Param=" + param.Name.ToString());
                        Response.Write("<br>  Type=" + param.ParameterType.ToString());
                        Response.Write("<br>  Position=" + param.Position.ToString());
                        Response.Write("<br>  Optional=" + param.IsOptional.ToString() + "</i>");
                    }
                }
            }
        }

BTW ... 내가 처음 포스트에서 제외,하지만 난 응답 중 일부는 너무 좋아 필터링foreach(Type type in asm.GetTypes()){ if ((type.ToString().IndexOf("ACLASSIMLOOKINGFOR")>=0) || (type.ToString().IndexOf("BCLASSIMLOOKINGFOR")>=0)){...
s15199d

2
이것은 질문에 전혀 대답하지 않습니다.
Govert

GetExecutingAssembly ()를 사용하는 대신 GetEntryAssembly ()를 사용하여 프로그램에서 사용하는 어셈블리의 더 나은 목록을 얻도록했습니다. ExecutingAssembly가 DLL 인 경우 몇 가지를 놓칠 것입니다.
해리 Glinos

6
다음을 사용해보십시오. Assembly [] assembly = AppDomain.CurrentDomain.GetAssemblies ();
DanW
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.