До .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;
}
}