2012-11-20 3 views
4

일부 어셈블리 조작 클래스를 테스트하기 위해 통합 테스트에서 어셈블리를 동적으로 만들고 싶습니다.비 현재 AppDomain에서 DefineDynamicAssembly를 사용하여 어셈블리를 동적으로 만드는 동안 예외가 발생했습니다.

var domain = AppDomain.CurrentDomain; 

var builder = domain.DefineDynamicAssembly(
    new AssemblyName(assemblyName), 
    AssemblyBuilderAccess.Save, 
    directory); 

builder.Save(fileName); 

후 모든 것이, 어셈블리가 필요한 위치에 생성됩니다 확인을 실행하지만이의 한 부분으로 그들은 또한, 현재 AppDomain에로드 I 돈 : 나는 테스트 어셈블리를 만들려면 다음 코드를 사용하는 경우 싶지 않아. 그래서

내가 비록 사용하여 어셈블리를 생성에 대한 AppDomain 별도의 :

var domain = AppDomain.CreateDomain("Test"); 

... 

그러나 코드를 실행하면 라인 var builder = domain.DefineDynamicAssembly(...);에서 예외가 발생합니다 :

System.Runtime.Serialization.SerializationException : 유형 'mscorlib, 버전 = 4.0.0.0, 문화 = 중립, PublicKeyToken = b77a5c561934e089'어셈블리의 'System.Reflection.Emit.AssemblyBuilder'는 직렬화 가능으로 표시되어 있지 않습니다.

난이도가 AppDomainDefineDynamicAssembly을 호출하는 것과 관련하여 어떤 실마리가 없습니다. 온라인에서 찾은 대부분은 별도의 도메인에서 어셈블리를 실행하는 것입니다. 아마 내가 여기에서하려고하는 것은 너무 구체적이거나, 너무 진보되었거나, 전혀 추천하지는 않지만, 우리의 모든 어셈블리 조작 코드를 테스트 할 수있게 할 것입니다.

누군가 올바른 방향으로 나를 가리킬 수 있습니까?

+0

해당 예외를 throw하는 실제 코드를 게시 할 수 있습니까? 그리고 왜 현재 AppDomain에로드하려고하지 않으십니까? 메모리가 걱정된다면 대신 AssemblyBuilderAccess.RunAndCollect를 사용해보십시오. – svick

+0

@svick 'var builder = domain.DefineDynamicAssembly (...);'라인에서 예외가 발생했습니다. 질문을 업데이트했습니다. – famousgarkin

+0

@svick "위조 된"어셈블리는 글로벌 스코프에 들어가기 위해 테스트간에 공유되지 않습니다. 지금은 대부분 순결한 이유가 있지만, 일부 어셈블리에는 나중에 문제가 될 수있는 코드가 포함될 것입니다. – famousgarkin

답변

1

suggested처럼 다른 AppDomain에서 코드를 실행하여 작동 시켰습니다.

var appdomain = AppDomain.CreateDomain("CreatingAssembliesAndExecutingTests", null, 
    new AppDomainSetup { ApplicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase }); 

appdomain.DoCallBack(() => 
{ 
    var assembly = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("temp"), AssemblyBuilderAccess.Run); 
    var module = assembly.DefineDynamicModule("DynModule"); 
    var typeBuilder = module.DefineType("MyTempClass", TypeAttributes.Public | TypeAttributes.Serializable); 
}); 

비고 당신은 다른 응용 프로그램 도메인의 위임을 찾기 위해 AppDomainSetup에 ApplicationBase를 지정해야합니다.