[c#] 이름으로 C # .Net 어셈블리를 얻는 방법?

다음과 같은 것이 있습니까?

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

따라서을 반복하는 대신 AppDomain.CurrentDomain.GetAssemblies()특정 어셈블리를 직접 가져올 수 있습니다.



답변

Assembly.Load (…) 살펴 보았습니까 ?


답변

LINQ로 해결했습니다.

Assembly GetAssemblyByName(string name)
{
    return AppDomain.CurrentDomain.GetAssemblies().
           SingleOrDefault(assembly => assembly.GetName().Name == name);
}


답변

달성하려는 작업에 따라 다릅니다.

어셈블리를 얻으려면 System.Reflection.Assembly.Load()(이미 지적했듯이) 전화해야합니다 . .NET은 어셈블리가 이미 현재 AppDomain에로드되었는지 여부를 자동으로 확인하고로드 된 경우 다시로드하지 않기 때문입니다.

어셈블리가로드 되었는지 여부 를 확인 하려는 경우 (아마도 진단상의 이유로)로드 된 모든 어셈블리를 반복해야합니다.

반복 할 수있는 또 다른 이유는 어셈블리 정보 중 일부만 알고있는 경우입니다 (예 : 버전이 확실하지 않음). 즉, “볼 때 인식”할만큼 충분히 알고 있지만로드 할만큼 충분하지 않습니다. 그러나 그것은 상당히 모호하고 가능성이 낮은 시나리오입니다.


답변

어셈블리의 메타 데이터 (버전 등)에 액세스해야하는 경우에는 메타 데이터 만로드 할 수있는 Assembly.ReflectionOnlyLoad (name)를 확인하여 메모리와 IO를 절약 할 수 있습니다.


답변

이것이 참조한 어셈블리 인 경우 다음과 같은 클래스를 작성하고 싶습니다.

namespace MyLibrary {
   public static class MyLibraryAssembly {
      public static readonly Assembly Value = typeof(MyLibraryAssembly).Assembly;
   }
}

그런 다음 해당 어셈블리에 대한 참조가 필요할 때마다 :

var assembly = MyLibraryAssembly.Value;


답변

필요한 작업을 수행하는 확장 메서드를 작성할 수 있습니다.

이 메서드는로드 된 어셈블리 만 열거합니다.로드 해야하는 경우 Assembly.Load허용 된 답변에서 사용 합니다.

public static class AppDomainExtensions
{
    public static Assembly GetAssemblyByName(this AppDomain domain, string assemblyName)
    {
        return domain.GetAssemblies().FirstOrDefault(a => a.GetName().Name == assemblyName);
    }
}

그런 다음 다음과 같이 AppDomain에서이 메서드를 호출합니다.

Assembly a = AppDomain.CurrentDomain.GetAssemblyByName("SomeAssembly")

경우 SomeAssembly은 현재 응용 프로그램 도메인에로드 방법은 그렇지 않으면 반환, 반환합니다 null.


답변

System.Reflection.Assembly 클래스, 특히 Load 메서드를 살펴보십시오. MSDN