2009-09-14 6 views
42

Lors de l'itération à travers un ensemble d'assemblages, par ex. AppDomain.CurrentDomain.GetAssemblies(), les assemblys dynamiques lanceront une exception NotSuportedException si vous essayez d'accéder à des propriétés telles que CodeBase. Comment pouvez-vous dire qu'un assembly est dynamique sans déclencher et attraper le NotSupportedException?Comment savoir si un assembly .NET est dynamique?

Répondre

41

Pour vérifier si l'ensemble est dynamique:

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

Cela m'a pris un certain temps pour comprendre, si elle est ici de réponse.

Mise à jour:

Dans .NET 4.0, il est maintenant une propriété:

if (assembly.IsDynamic) 
+5

Pas tout à fait correct. Un modulebuilder peut être 'non-dynamique'. Vous devriez utiliser 'ModuleBuilder.IsTransient' pour vérifier 'dynamic'. – leppie

18

Dans .NET 4, vous pouvez également vérifier la propriété Assembly.IsDynamic.

+0

Enfin Microsoft a fourni ceci :) C'est évidemment le chemin à parcourir à partir de maintenant. –

0

Avant .NET Framework 4, la solution la plus simple semble être de vérifier si l'assembly est de type System.Reflection.Emit.AssemblyBuilder. C'est la solution que nous utilisons dans notre équipe.

Si vous regardez l'implémentation de la propriété CodeBase de AssemblyBuilder, elle lève simplement une exception, indépendamment de quoi que ce soit d'autre. AssemblyBuilder est également une classe scellée, il est donc impossible pour une classe dérivée de modifier ce comportement. Donc, si vous avez un objet AssemblyBuilder, vous pouvez être certain que vous ne pouvez jamais appeler CodeBase ou GetManifestResourceStream ou un tas d'autres méthodes.

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

Et dans .NET Framework 4, vérification de la propriété Assembly.IsDynamic devrait être préférable car il est plus lisible et peut-être plus à l'épreuve, dans le cas où une nouvelle classe vient qui outrepasse isDynamic. Comme AssemblyBuilder.IsDynamic renvoie toujours la valeur true, il s'agit plus d'une preuve qu'un objet AssemblyBuilder est toujours équivalent à une "DLL dynamique".

Voici le .NET 4 isDynamic de AssemblyBuilder:

public override bool IsDynamic 
{ 
    get { 
     return true; 
    } 
} 
Questions connexes