反射が本当に掛かる・・・


ええと、CLRの反射も文字列に注入できますが...ここにも遊べる突破口OTLがあるようですね
次のコード:
using System;
using System.Reflection;
using System.Reflection.Emit;

static class Program {
    static void Main() {
        var assemblyName = new AssemblyName( "DemoAssembly" );
        var assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Run );
        var moduleBuilder = assemblyBuilder.DefineDynamicModule( "DemoAssembly" );
        var baseTypeBuilder = moduleBuilder.DefineType(@"Base+My", TypeAttributes.Public);
        var baseType = baseTypeBuilder.CreateType();
        var derivedTypeBuilder = moduleBuilder.DefineType("Derived", TypeAttributes.Public, baseType);
        var derivedType = baseTypeBuilder.CreateType();
        var instance = Activator.CreateInstance(derivedType);
    }
}

生成されたベースクラス名に[]*&+,の任意の文字を入れると、派生クラスの作成にエラーが発生します.
参照
Unhandled Exception: System.Runtime.InteropServices.COMException (0x80131130): Record not found on lookup. (Exception from HRESULT: 0x80131130)
   at System.Reflection.Module._InternalGetTypeToken(String strFullName, ModulerefedModule, String strRefedModuleFileName, Int32 tkResolution)
   at System.Reflection.Module.InternalGetTypeToken(String strFullName, Module refedModule, String strRefedModuleFileName, Int32 tkResolution)
   at System.Reflection.Emit.ModuleBuilder.GetTypeRefNested(Type type, Module refedModule, String strRefedModuleFileName)
   at System.Reflection.Emit.ModuleBuilder.GetTypeTokenWorkerNoLock(Type type, Boolean getGenericDefinition)
   at System.Reflection.Emit.ModuleBuilder.GetTypeTokenInternal(Type type, Boolean getGenericDefinition)
   at System.Reflection.Emit.TypeBuilder.Init(String fullname, TypeAttributes attr, Type parent, Type[] interfaces, Module module, PackingSize iPackingSize, Int32 iTypeSize, TypeBuilder enclosingType)
   at System.Reflection.Emit.ModuleBuilder.DefineTypeNoLock(String name, TypeAttributes attr, Type parent)
   at System.Reflection.Emit.ModuleBuilder.DefineType(String name, TypeAttributes attr, Type parent)
   at Program.Main() in d:\experiment\test\crash.cs:line 12
OTL......それらの文字はCLIのタイプのいくつかの特殊な文字で、例えば+はnested classの完全な限定名の中でそれ自身のクラス名とenclosing classのクラス名を区切る文字で、[]は汎用パラメータを指定するために使うなどです.反射するときも、どれが正常な特殊文字なのか、どれが人為的に注入されているのかをチェックできないかもしれません.以上、Emitの場合、これらの特殊文字を入れることは許されません.注入して注入して・・・
P.S.テスト環境は.NET Framework 3.5 SP1