2009-11-15 4 views
7

System.CodeDom.CodeCompileUnit을 사용하여 동적으로 일부 유형을 빌드하고이를 메모리의 IL 코드로 컴파일하고 해당 IL 코드를 메모리에로드 된 어셈블리에 삽입하려고합니다.이 중 하나를 디스크에 저장할 필요가 없습니다. 어쩌면 내 계획이 잘못되었을 수도 있습니다. 해당 대상으로 CodeCompileUnit 인스턴스를 가져 오는 방법에 대한 다른 제안을 엽니 다.어떻게 코드를 내보내고로드 된 어셈블리에 삽입합니까?

+1

왜 이미로드 된 어셈블리에 유형을 삽입해야합니까? 왜 현재 조립중인 어셈블리에 삽입 할 수 없습니까? – yfeldblum

+1

@ Justice : 그것은 좋은 지적입니다. 무엇보다도 호기심입니다. 가능한 시나리오를 고안해야한다면 다음과 같은 것들이 있습니다 : 메모리에서 작업함으로써 어셈블리를 만드는 것에 대한 파일 시스템 권한을 회피하는 것; 또는 어셈블리에 코드를 삽입하고 동적으로 호출하여 앱을 다시 컴파일 할 필요없이 사물을 검사 할 수 있습니다. –

+0

나는 이것을 할 수있는 방법이 있는지 확신하지 못합니다. 있다면, 알고 싶습니다. –

답변

7

ICorDebug 인터페이스를 사용하여 기존 (이미로드 된) 어셈블리에 코드를 삽입 할 수 있습니다. 편집하고 계속하십시오.

델타 바이트를 계산하고 ICorDebugModule2::ApplyChanges으로 전화하십시오. 자세한 내용은 MDbg sample code을 참조하십시오.

이전에 우리는 ICorDebugModule::GetEditAndContinueSnapshot과 친족을 사용 했었지만, 이제는 더 이상 사용되지 않습니다.

업데이트 이미로드 된 어셈블리에 코드를 삽입하는 것에 신경 쓰지 않는다면 Reflection.Emit을 사용하여 새 어셈블리를 만드는 것이 더 효율적이고 훨씬 쉽습니다.

+0

이 솔루션은 직접 질문에 대답합니다. 감사. –

1

System.Reflection.Emit 네임 스페이스를 사용하여 동적 인 메모리 어셈블리를 만들 수도 있습니다.

다른 방법으로 CodeDom을 사용하여 & 컴파일 코드를 생성 한 다음 호출하십시오.

XMLSerialization()은 후자를 수행합니다.

1

Mono.Cecil을 사용하여 IL을 조작 할 수 있습니다. 어떻게 든 문서가 부족하지만 강력한 도구입니다.

관련 문제