이름으로 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.