2009-09-14 14 views
42

Podczas powtarzania zestawu zestawów, np. AppDomain.CurrentDomain.GetAssemblies(), zespoły dynamiczne będą generować wyjątek NotSuportedException, jeśli spróbujesz uzyskać dostęp do właściwości takich jak CodeBase. Jak można stwierdzić, że zestaw jest dynamiczny bez wyzwalania i przechwytywania wyjątku NotSupportedException?Jak sprawdzić, czy zestaw .NET jest dynamiczny?

Odpowiedz

41

Aby sprawdzić, czy zespół jest dynamiczny:

if (assembly.ManifestModule is System.Reflection.Emit.ModuleBuilder) 

Zajęło mi trochę czasu, aby dowiedzieć się, więc o to jest pytanie i odpowiedź.

Aktualizacja:

W .NET 4.0, obecnie istnieje właściwość:

if (assembly.IsDynamic) 
+5

Nie całkiem poprawne. Konstruktor modułów może być "niedynamiczny". Powinieneś użyć 'ModuleBuilder.IsTransient', aby sprawdzić 'dynamic'. – leppie

18

W .NET 4 można również sprawdzić właściwość Assembly.IsDynamic.

+0

Wreszcie Microsoft zapewnił to :) To jest oczywiście droga, którą należy przejść od teraz. –

0

Przed .NET Framework 4, najprostszym rozwiązaniem wydaje się być sprawdzenie, czy Assembly jest typu System.Reflection.Emit.AssemblyBuilder. To jest rozwiązanie, którego używamy w naszym zespole.

Jeśli przyjrzeć się implementacji właściwości CodeBase AssemblyBuilder, po prostu zgłasza wyjątek, niezależnie od czegokolwiek innego. AssemblyBuilder jest również klasą zapieczętowaną, więc klasa pochodna nie może zmienić tego zachowania. Tak więc, jeśli masz obiekt AssemblyBuilder, możesz być pewien, że nigdy nie możesz wywołać CodeBase lub GetManifestResourceStream lub kilku innych metod.

public override string CodeBase 
{ 
    get 
    { 
     throw new NotSupportedException(Environment.GetResourceString("NotSupported_DynamicAssembly")); 
    } 
} 

A w .NET Framework 4, sprawdzając właściwość Assembly.IsDynamic powinny być korzystne, ponieważ jest to bardziej czytelne i być może bardziej przyszłościowe, w przypadku niektórych nowa klasa przychodzi który nadpisuje IsDynamic. Ponieważ AssemblyBuilder.IsDynamic zawsze zwraca wartość true, jest to więcej dowodów na to, że obiekt AssemblyBuilder jest zawsze równoważny z "dynamiczną biblioteką dll".

Oto .NET 4 AssemblyBuilder za IsDynamic:

public override bool IsDynamic 
{ 
    get { 
     return true; 
    } 
} 
Powiązane problemy