2010-05-02 2 views
9

런타임에 특정 클래스에 일부 비헤이비어를 추가하려고합니다. 나는 Reflection.Emit를 사용하여 런타임에 하위 클래스를 만드는 방법을 알고 있지만 충분하지 않다. 일부 외부 구성에 따라 유형 T의 메소드에 opcode를 삽입해야하므로이 클래스에서 상속받은 모든 클래스가 자동으로이 동작을 얻는다. .NET 프로파일 링 API)Mono.Cecil이 이미 AppDomain에로드 된 코드를 수정할 수 있습니까?

Mono.Cecil을 사용하여 이와 유사한 작업을 수행 할 수 있습니까?

로드 된 어셈블리에서 코드를 수정할 수 없다면 어셈블리가로드되기 전에 수정을 수행 한 다음 수정 된 어셈블리를 메모리에로드 할 수는 있지만 어셈블리로드를 제어하는 ​​방법은 알지 못합니다.

+0

코드를 최적화하기를 원하십니까? 계측의 대안으로 샘플링에 대한 아이디어에 열려 있습니까? "정확하다"는 이유로 많은 사람들이 계측을 믿습니다. 이는 최적화에 필요한 것이 아닙니다. 최적화하려는 경우이 방법을 고려하십시오. http://stackoverflow.com/questions/375913/what-can-i-use-to-profile-c-code-in-linux/378024#378024 –

+0

최적화되지 않았습니다. 내가 원하는 건 구성을 기반으로 프레임 워크에 동작을 추가하는 것입니다. 예를 들어, 일부 구성을 읽고 기본 클래스 T에 public 속성을 추가하면 TypeDescriptor 검사 메커니즘을 사용합니다. 그런 다음 TypeDescriptor 메커니즘을 사용하여 T 또는 하위 클래스를 검사하면 해당 속성이 표시되지만 동일한 검사가 수행되는 경우 반사를 사용하면 속성이 누락됩니다. Type이 실제로 수정되지 않았으므로이 속성은 TypeDescriptor 검사의 컨텍스트에 추가되었습니다. –

답변

6

아니요, 세실은로드 된 어셈블리를 수정할 수 없습니다. 어셈블리가 실제로로드되기 전에 어셈블리를 계측해야합니다.

어셈블리를 해결하는 방법에 대한 많은 제어 권한이 없습니다. 자신의 개인 폴더에서 어셈블리를 숨기고 AppDomain.AssemblyResolve를로드하기 전에 계측기를 숨기면 AppDomain.AssemblyResolve에 연결할 수 있습니다.

+0

그게 내가 필요로하는 것, 나는이 사건에 대해 알지 못했다. 고마워. –

1

JB가 말한대로 - PSeudoHooking과 같은 Resolve 이벤트 처리기를 만들 수 있습니다. 어셈블리가로드되기 전에 변경 한 다음 변경이 완료되면 어셈블리 확인이 계속 진행되어 변경된 어셈블리를로드합니다.

이 방법을 사용하여 메모리 스트림에서 Embedded DLL을 확인합니다.

관련 문제