문제

다음과 같은 버그가 있는 애플리케이션이 있다고 가정해 보겠습니다.

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("2 + 1 = {0}", Add(2, 1));
        }

        static int Add(int x, int y)
        {
            return x + x; // <-- oops!
        }
    }
}

애플리케이션은 이미 컴파일되어 실제 환경에 배포되었습니다.누군가가 버그를 발견했고 이제 수정을 요청하고 있습니다.수정 사항을 적용하여 이 응용 프로그램을 다시 배포할 수는 있지만 통제할 수 없는 이유로 인해 매우 번거롭습니다. 대신 버그에 대한 패치를 작성하고 싶습니다.

특히 문제가 되는 어셈블리 소스 파일에 내 MSIL을 삽입하고 싶습니다.나는 이전에 이런 일을 해본 적이 없으며 인터넷 검색으로 유용한 정보를 얻지 못했습니다.위의 코드에서 이 작업을 수행하는 방법에 대한 샘플을 볼 수 있다면 엄청난 도움이 될 것입니다. :)

컴파일된 .NET 어셈블리에 자체 MSIL을 프로그래밍 방식으로 삽입하려면 어떻게 해야 합니까?

[추가 편집:] 질문자에게:런타임 핫스와핑이 필요하지 않습니다.앱을 닫고 어셈블리를 조작한 다음 프로그램을 다시 시작해도 전혀 문제가 없습니다.

[한 번 더 편집:] 일반적인 합의는 "어셈블리를 조작하는 것은 나쁜 프로그램을 패치하는 방법".나는 그 길로 가지 않을 것이다. 나쁜 생각.

MSIL 주입은 다른 목적에도 여전히 유용할 수 있으므로 질문은 열어두겠습니다. :)

도움이 되었습니까?

해결책

제가 묻고 싶은 질문은 "패치를 어떻게 배포하시겠습니까?"입니다.어딘가에 이미 존재하는 버그를 수정하기 위해 무언가를 배포해야 합니다.DLL을 다시 컴파일하고 수정된 버전을 릴리스하는 것이 실제로 문제가 되는 이유는 무엇입니까?내 생각에는 MSIL을 프로그래밍 방식으로 주입하는 방법을 알아내는 것이 단순히 고정 어셈블리를 재배포하는 것보다 더 어려울 것 같습니다.

다른 팁

런타임에 MSIL을 주입하는 대신 소스를 어셈블리에 직접 삽입하는 것을 고려해 보셨나요?

ildasm으로 분해하고 MSIL을 삽입한 다음 ilasm으로 다시 조립한 다음 해당 제품을 배포할 수 있습니다.

전체 내용을 재배포하고 싶지 않은 이유가 실제로 작업의 절반이기 때문이라면 아마도 일종의 바이너리 패치 도구를 사용해야 할 것입니다. 이것이 Google의 첫 번째 결과입니다.

바이너리 차이점 http://www.daemonology.net/bsdiff/

exe가 서명되어 있으면 불가능합니다.전체 애플리케이션을 다시 출시하는 대신 해당 단일 어셈블리를 출시할 수 없는 이유는 무엇입니까?단순한 문제에 대한 복잡한 해결책을 목표로 하고 있는 것 같습니다.

정적 MSIL 주입을 사용할 수 있습니다.Mono Cecil 또는 PostSharp가 도움이 될 수 있습니다.

좋은 정보원...

IL 프로그래밍 전자책

또 다른 하나는 IL 프로그래밍에 관한 MS Press 책입니다.

IL로 디컴파일하고 다시 컴파일하는 단계

1.ildasm /output=ConsoleApplication1.il ConsoleApplication1.exe

2.//ConsoleApplication1.il 코드 수정

삼.ilasm ConsoleApplication1.il

이 작업을 성공적으로 수행하려면 비관리 코드가 필요하지만 수행할 수 있습니다.

보다 http://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top