2017-12-28 79 views
3

종속 어셈블리 이름, 종속 DLL이로드되는 위치 및 종속 DLL의 종속성을 얻으려고합니다.C# .NET에서 종속성 어셈블리 경로를 찾는 방법

".exe"파일의 경로가 입력됩니다.

종속성을 찾으려면 다음 코드를 사용하고 있습니다.

var assemblies = Assembly.LoadFile("C:\\My Folder\\ MyApp.exe").GetReferencedAssemblies(); 

"조립체"는System.Reflection.AssemblyName 클래스 오브젝트의 컬렉션이다.

for-each를 사용하여 어셈블리 이름 목록을 가져 와서 종속성 목록을 찾습니다.

  1. 어떻게 각각의 종속 어셈블리의 위치를 얻으려면?

  2. 종속 어셈블리 종속성 종속성을 얻는 방법? 예를 들어 MyApp 응용 프로그램에서 myAppBase.dll을 사용하는 경우 myAppBase.dll의 종속성을 어떻게 얻을 수 있습니까?

+3

@Stefan MSDN 답변 1) "어셈블리"의 "위치"를 확인하십시오. 2) 어셈블리 객체에서 응용 프로그램의 depdencencies을 얻을 수 있다면 확실히 어셈블리 객체에서 참조 된 어셈블리의 참조 된 어셈블리를 가져올 수 있습니다. 나는 그 질문을 프로세스를 논리적으로 생각하지 않고 문서를 읽지 못하는 것으로 만 봅니다. 일반적으로 노력이 적은 것 같습니다. – john

+0

@john : 의견을 보내 주셔서 감사합니다. AssemblyName 클래스에서 어셈블리 객체를 가져 오는 방법을 알려주시겠습니까? – Venkat

+1

제안 사항을 추가했습니다. – john

답변

3

이와 비슷한 것은 참조 된 모든 어셈블리를 가져와야합니다. AssemblyName을 어셈블리로 변환하려면로드해야합니다. 그러면 참조 된 모든 어셈블리와 함께 열거 형이 반환됩니다. HashSet을 전달할 필요가 없습니다. 무한 루프를 막는 재귀 호출에만 사용됩니다.

로드하지 않으려면 별도의 AppDomain으로로드 한 다음 나중에 언로드하는 것이 좋습니다.

private static IEnumerable<Assembly> GetReferencedAssemblies(Assembly a, HashSet<string> visitedAssemblies = null) 
{ 
    visitedAssemblies = visitedAssemblies ?? new HashSet<string>(); 
    if (!visitedAssemblies.Add(a.GetName().EscapedCodeBase)) 
    { 
     yield break; 
    } 

    foreach (var assemblyRef in a.GetReferencedAssemblies()) 
    { 
     if (visitedAssemblies.Contains(assemblyRef.EscapedCodeBase)) { continue; } 
     var loadedAssembly = Assembly.Load(assemblyRef); 
     yield return loadedAssembly; 
     foreach (var referenced in GetReferencedAssemblies(loadedAssembly, visitedAssemblies)) 
     { 
      yield return referenced; 
     } 

    } 
} 

DLL의 위치에 관해서는, 당신은 그것을 검색 할 Assembly 객체에 Location를 사용할 수 있습니다.