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


89

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

AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")

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

답변:



72

LINQ로 해결했습니다.

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

7
이는 해당 어셈블리가로드 된 경우에만 작동합니다. 웹 API에서 DAL의 유형을 등록 할 때 도움이되지 않을 수 있습니다
— Chazt3n

17

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

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

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

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


System.Reflection.Assembly.Load ()는 필요한만큼 완벽합니다.
— Jronny 2009


6

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

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

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

var assembly = MyLibraryAssembly.Value;

이것은 제가 항상 찾던 매우 깨끗한 솔루션입니다! 다음과 같이 사용할 수 있습니다.options.RegisterFromAssembly(Application.AssemblyReference.Value)
— Alielson Piffer

3

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

이 메서드는로드 된 어셈블리 만 열거합니다.로드 해야하는 경우 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.


GetAssemblyByName ()을 찾지 못했습니다
— Ziggler

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.