2009-10-06 5 views
3

동적 열거 형을 만들고 Type.GetType() 사용하여 형식을 가져올 수 있어야합니다. 이것이 가능한가?동적 열거 형 만들기 및 참조 시도 BindingFailure 함께 실패합니다

아래 코드는 동적 열거 형을 만들고 그 정규화 된 이름을 사용하려고 시도합니다. AssemblyBuilderAccess.RunAndSave를 사용하여 어셈블리를 처음 저장하는 경우에는 문제가 없습니다. 그러나 AssemblyBuilderAccess.Run 만 사용하는 경우에는이 작업을 수행 할 수 없습니다. BindingFailure 오류가 발생합니다. 어셈블리를 찾을 수 없습니다. 내 생각에 Run 옵션은 실제로 어셈블리를 저장하지 않고 (또는 다른 빌더에 액세스하지 않고도) 생성 및 사용을 허용합니다.

(참고 :.. Type.GetType()의 아래 코드 사용이 광산은 내가 그 코드를 변경할 수 없습니다)

가 어떻게, 어셈블리를 저장하지 않고, 그것을 동적 열거를 생성하고 참조 할 수 있습니다?

 private Type CreateType() 
     {   
     // Define the assembly. 
     System.Reflection.Emit.AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(new System.Reflection.AssemblyName("temporaryAssembly"), AssemblyBuilderAccess.Run); 

     // Actually create it. 
     System.Reflection.Emit.ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("temporaryAssembly"); 

     // Create the enum. 
     System.Reflection.Emit.EnumBuilder enumBuilder = moduleBuilder.DefineEnum("Temp", System.Reflection.TypeAttributes.Public, typeof(int)); 

     /* Populate the enum. */ 

        return enumBuilder.CreateType(); 
     } 

     private void DoStuff() 
     { 
        Type t = CreateType(); 
        Type createAnotherOfSameType = Type.GetType(t.AssemblyQualifiedName); 
     }/ 

답변

0

나는 당신이 무엇을하려고하는지 이해하지 못합니다. 두 가지 문제 : 1) 두 번째 줄은 첫 번째 줄과 동일한 참조가 될 Type에 대한 참조를 다시 얻으려고합니다. 당신이 받고있는 인스턴스가 아닙니다. 2) IIRC, AssemblyQualifiedName은 메모리 내 유형/어셈블리의 경우 null입니다.

+0

두 번째 줄은 다른 어셈블리에서 수행됩니다. 나는 그 특정 코드를 사용하여 나중에 처리 할 어셈블리에 't'를 전달할 것이다. 위는 단지 설명을위한 것입니다. –

+0

그건 그렇고, AssemblyQualifiedName 실제로 (겉으로보기) 올바른 정보를 반환합니다. –

2

-Oisin 이것은 실제로 지금 MSDN에 설명되어 있습니다 :

GetType을 단지 디스크에서로드 어셈블리에서 작동합니다. GetType 을 호출하여 System.Reflection.Emit 서비스를 사용하여 정의 된 동적 어셈블리에 정의 된 형식을 조회 할 경우 일관성없는 동작이 발생할 수 있습니다. 동작은 동적 어셈블리가 인지 여부, 즉 System.Reflection.Emit.AssemblyBuilderAccess 열거 형의 RunAndSave 또는 저장 액세스 모드를 사용하여 생성되었는지 여부에 따라 달라집니다. [...] GetType이 호출 될 때 어셈블리가 디스크에 저장되지 않은 경우 메서드는 null을 반환합니다. GetType은 일시적인 동적 인 어셈블리를 인식하지 못합니다. 따라서 GetType을 호출하여 임시 동적 어셈블리의 형식을 검색하면 null이 반환됩니다.

워드 프로세서는 동적 어셈블리를 해결하기 위해 AppDomain.AssemblyResolve를 구독 할 수 있다는 말에 의해 이동합니다.