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?
Réponses
Trop de publicités?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;
}
}