44 votes

Comment savoir si un assemblage .NET est dynamique?

Lors d'une itération dans un ensemble d'assemblys, par exemple AppDomain.CurrentDomain.GetAssemblies (), les assemblages dynamiques génèrent une exception NotSuportedException si vous essayez d'accéder à des propriétés telles que CodeBase. Comment savoir qu'un assemblage est dynamique sans déclencher ni intercepter l'exception NotSupportedException?

43voto

Mike Stockdale Points 2836

Pour vérifier si l'assemblage est dynamique:

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

Cela m'a pris un certain temps à comprendre, donc ici, il est demandé et répondu.

Mettre à jour:

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

if (assembly.IsDynamic)

22voto

Nich Overend Points 421

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

0voto

Ron Points 191

Avant .NET Framework 4, la solution la plus simple semble être de vérifier si le Montage est de type System.De la réflexion.En émettent.AssemblyBuilder. C'est la solution que nous utilisons sur notre équipe.

Si vous jetez un oeil à la AssemblyBuilder du Code de la propriété de la mise en œuvre, tout simplement, il lève une exception, indépendamment de toute autre chose. AssemblyBuilder est aussi une classe scellée, il est donc impossible pour une classe dérivée de modifier ce comportement. Donc, si vous avez un AssemblyBuilder objet, vous pouvez être certain que vous pouvez ne jamais appeler la base de Code ou GetManifestResourceStream ou un tas d'autres méthodes.

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

Et dans les .NET Framework 4, de la vérification de l'Assemblée.IsDynamic de propriété devraient être préférable car il est plus lisible et peut-être plus d'avenir, dans le cas ou une nouvelle classe vient le long qui remplace IsDynamic. Depuis AssemblyBuilder.IsDynamic renvoie toujours vrai, ce n'est plus la preuve qu'un AssemblyBuilder objet est toujours équivalent à une "dynamique de la dll".

Voici l' .NET 4 AssemblyBuilder de IsDynamic:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: