2009-09-14 13 views
42

Beim Iterieren durch einen Satz von Baugruppen, z.B. AppDomain.CurrentDomain.GetAssemblies(), dynamische Assemblies werden eine NotSuportedException auslösen, wenn Sie versuchen, auf Eigenschaften wie CodeBase zuzugreifen. Wie können Sie feststellen, dass eine Assembly dynamisch ist, ohne die NotSupportedException auszulösen und abzufangen?Wie erkennt man, ob eine .NET-Assembly dynamisch ist?

Antwort

41

Um zu überprüfen, ob die Baugruppe ist dynamisch:

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

mich Dies dauerte eine Weile, um herauszufinden, ist es so hier gefragt und beantwortet.

Update:

In .NET 4.0, gibt es jetzt eine Eigenschaft:

if (assembly.IsDynamic) 
+5

Nicht ganz richtig. Ein Modulhersteller kann "nicht dynamisch" sein. Sie sollten 'ModuleBuilder.IsTransient' verwenden, um nach 'dynamisch' zu suchen. – leppie

18

In .NET 4 können Sie auch die Assembly.IsDynamic Eigenschaft überprüfen.

+0

Endlich hat Microsoft das zur Verfügung gestellt :) Dies ist offensichtlich der Weg, von jetzt an zu gehen. –

0

Vor .NET Framework 4 scheint die einfachste Lösung zu sein, zu überprüfen, ob die Assembly vom Typ System.Reflection.Emit.AssemblyBuilder ist. Dies ist die Lösung, die wir in unserem Team anwenden.

Wenn Sie sich die Implementierung der CodeBase-Eigenschaft von AssemblyBuilder ansehen, wird einfach eine Ausnahme ausgelöst, unabhängig von anderen Dingen. AssemblyBuilder ist auch eine versiegelte Klasse. Daher kann eine abgeleitete Klasse dieses Verhalten nicht ändern. Wenn Sie also ein AssemblyBuilder-Objekt haben, können Sie sicher sein, dass Sie niemals CodeBase oder GetManifestResourceStream oder eine Reihe anderer Methoden aufrufen können.

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

Und in .NET Framework 4, sollte die Assembly.IsDynamic Eigenschaft überprüfen vorzuziehen sein, weil es besser lesbar und vielleicht mehr zukunftssicher, falls es einige neue Klasse kommt, dass IsDynamic außer Kraft setzt. Da AssemblyBuilder.IsDynamic immer true zurückgibt, ist dies ein weiterer Beweis dafür, dass ein AssemblyBuilder-Objekt immer einer "dynamischen DLL" entspricht.

Hier ist das .NET 4 Assembly des IsDynamic:

public override bool IsDynamic 
{ 
    get { 
     return true; 
    } 
} 
Verwandte Themen