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

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

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

4b9b3361

Ответ 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; 
    } 
}