수정하는 기존.NET 어셈블리
-
02-07-2019 - |
문제
는 방법이 있을 수정하는 기존.NET 어셈블리에 의존하지 않고 제 3 자 tools?내가 알고 있는 PostSharp 이것을 가능하게 하지만 그것을 찾을 믿을 수 없을만큼 낭비는 developler 의 PostSharp 기본적으로 다시 작성했다하는 기능의 전체 System.Reflection
네임스페이스하기 위해서는 기존 어셈블리를 수정할 수 있습니다.
System.Reflection.Emit
만 만들 수 있는 새로운 동적 어셈블리입니다.그러나,모든 빌더는 클래스가 여기에 사용되는 상속에서의 기본적인 반사 클래스(예. TypeBuilder
에서 상속 System.Type
).불행하게도,거기에있을 것 같지 않는 방법을 강요하는 것,기존의 동적으로 읽어 형식으로 입력 builder.최소 없이 공식적인 지원 방법입니다.
그래서 무엇에 대해 지원되지 않는?지의 백도어는 허용을 로드하는 기존 어셈블리 또는 유형으로 이러한 빌더는 클래스가?
마 나는 지 는 방법을 찾을 수정하면 현재 어셈블리(이 도 심지어는 불합리한 요청 시)을 하지만 수정하는 기존 어셈블리드에서 디스크에 있습니다.나는 두려움이 없다 그런 일이지만 여러분께 여쭤보고 싶은 것이 어쨌든.
최악의 경우에,하나의 리조트 ildasm.exe
하는 코드를 분해하고 다음 ilasm.exe
에 대한 재조립지 없 toolchain(읽기:IL 리더)를 포함합니다.NET 작업 IL 데이터(나 있는가?).
/편집:
나는 어떤 특정한 사용한 경우.나는 그냥에 관심있는 일반적인 목적의 솔루션이기 때문에 패치 기존 어셈블리는 아주 일반적인 작업입니다.을 난독 처리기 예를 들어,또는 프로파일러 또는 AOP 라이브러리(예,후기 수 구현되는 다르게).내가 말했듯이,그것은 보인다 믿을 수 없을만큼 낭비하는 것을 강요하고 다시 쓰기의 큰 부분은 이미 기존 인프라 System.Reflection
.
@쐐기:
당신이 맞습니다.그러나,특정 사용하는 경우 여기에.나는 수정 원래의 질문에 이를 반영합니다.나의 관심을 촉발되었으로 또 다른 문제는 asker 는 방법을 알고 싶어 그를 주입할 수 있는 지침 pop
고 ret
의 끝에 모든 방법을 유지하기 위해서 루츠 Roeder 의 반사체에서 재 설계(VB 또는 C#)소스 코드입니다.
지금 이 시나리오으로 깨달을 수 있습니다수의 도구,예를 들어,PostSharp 위에서 언급하고 Reflexil 플러그인에 대한 반사체,저것은,차례차례로,사용 Cecil 라이브러리입니다.
에서 모든 난 그냥 만족하지 않습니다.NET framework.
@Joel:
그렇다,나는 알고 있으로 이러한 제한이 없어졌습니다.어쨌든 감사해 가리키는 그것 때문에,그것의 중요합니다.
@marxidad:
이처럼 보인다 실현 가능한 유일한 접근 방식이다.그러나,이 의미는 아직도를 다시 전체를 사용하여 어셈블리 빌더는 클래스를,오른쪽?I.e.할 수 있는 전체를 조립합니다.
Hmm,으로 살펴 보겠다.
해결책
당신이 사용할 수 있는 MethodInfo.GetMethodBody().GetILAsByteArray(), 고,수정하는 것,그리고 그런 다음 다시 연결로 MethodBuilder.CreateMethodBody().
다른 팁
모노.세실 수도 있습을 제거하는 강력한 이름에서 주어진 어셈블리에 저장하지 않 어셈블리입니다.당신은 당신의 강한 이름이 어셈블리에서,당신은 당신을 수정할 수 있습 IL 대상의 방법과 사용하여 어셈블리는 당신이 어떤 다른 어셈블리입니다.여기에 대한 링크를 제거하기 위한 강력한 이름으로 세실:
면을 제거 강력한 이름할 수 있습니다 당신이 무엇을 원하는 어셈블리입니다.을 즐길!
그것은 도움이 될 경우 제공할 수 있습니다 더 많은 특정 사용하여 케이스,거기에 아마 더 나은 방법으로 문제를 해결합니다.
습니다.NET3.5 가능 확장을 추가하는 방법 기존 프레임워크 클래스,아마도 그것은 충분한가요?
하나의 중요한 포인트:어셈블리 명, 모든 변경 내용이 실패할 것이고 당신은 끝날 것이 dud.
.NET Framework 어셈블리에 서명되고 그냥 조엘 Coehoorn 말했다 얻을 것이 dud.
할 수 있습드를 사용하여 어셈블리 IronRuby 및 mixin 모든 기능을 할 수 있습의 꿈