Как определить, является ли сборка .NET динамической?

При повторении через набор сборок, например. AppDomain.CurrentDomain.GetAssemblies(), динамические сборки будут бросать исключение NotSuportedException, если вы попытаетесь получить доступ к таким свойствам, как CodeBase. Как вы можете сказать, что сборка является динамической без запуска и обнаружения NotSupportedException?

Ответ 1

Чтобы проверить, является ли сборка динамической:

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

Мне потребовалось некоторое время, чтобы разобраться, поэтому здесь его спрашивают и отвечают.

Update:

В .NET 4.0 теперь есть свойство:

if (assembly.IsDynamic)

Ответ 2

В .NET 4 вы также можете проверить свойство Assembly.IsDynamic.

Ответ 3

До .NET Framework 4 самым простым решением является проверка того, является ли сборка типа System.Reflection.Emit.AssemblyBuilder. Это решение, которое мы используем в нашей команде.

Если вы посмотрите на реализацию свойства AssemblyBuilder CodeBase, он просто выдает исключение, независимо от чего-либо еще. AssemblyBuilder также является закрытым классом, поэтому невозможно, чтобы производный класс изменил это поведение. Итак, если у вас есть объект AssemblyBuilder, вы можете быть уверены, что никогда не сможете вызвать CodeBase или GetManifestResourceStream или кучу других методов.

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

И в .NET Framework 4 проверка свойства Assembly.IsDynamic должна быть предпочтительнее, потому что она более четкая и, возможно, более надежная в будущем, в случае появления какого-то нового класса, который переопределяет IsDynamic. Поскольку AssemblyBuilder.IsDynamic всегда возвращает true, это больше свидетельствует о том, что объект AssemblyBuilder всегда эквивалентен "динамической dll".

Здесь .NET 4 AssemblyBuilder IsDynamic:

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