При повторении через набор сборок, например. AppDomain.CurrentDomain.GetAssemblies(), динамические сборки будут бросать исключение NotSuportedException, если вы попытаетесь получить доступ к таким свойствам, как CodeBase. Как вы можете сказать, что сборка является динамической без запуска и обнаружения NotSupportedException?
Как определить, является ли сборка .NET динамической?
Ответ 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;
}
}