Как определить, является ли сборка .NET динамической? - PullRequest
43 голосов
/ 15 сентября 2009

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

Ответы [ 3 ]

42 голосов
/ 15 сентября 2009

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

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

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

Обновление:

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

if (assembly.IsDynamic)
20 голосов
/ 30 июня 2011

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

0 голосов
/ 20 июля 2012

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

Если вы посмотрите на реализацию свойства CodeBase в AssemblyBuilder, он просто генерирует исключение, независимо от чего-либо еще. 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».

Вот IsDynamic .NET 4 AssemblyBuilder's:

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