다음과 같은 것이 있습니까?
AppDomain.CurrentDomain.GetAssemblyByName("TheAssemblyName")
따라서을 반복하는 대신 AppDomain.CurrentDomain.GetAssemblies()
특정 어셈블리를 직접 가져올 수 있습니다.
답변:
달성하려는 작업에 따라 다릅니다.
어셈블리를 얻으려면 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;
options.RegisterFromAssembly(Application.AssemblyReference.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
System.IO.FileNotFoundException
위해 어셈블리를로드 할 수없는 경우이 문제가 발생합니다.