Pergunta

Digamos que eu tenho um aplicativo de buggy como esta:

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!
        }
    }
}

O aplicativo já está compilado e implantado para a vida selvagem. Alguém encontrou o erro, e agora eles estão solicitando uma correção para ele. Enquanto eu poderia re-implantar esse aplicativo com a correção, seu um aborrecimento extremo por motivos fora do meu controle - Eu só quero escrever um patch para o bug em vez

.

Especificamente, eu quero inserir minha própria MSIL para o arquivo de origem ofender assmembly. Eu nunca fiz nada como isso antes, e googling não apareceu qualquer informação útil. Se eu pudesse ver um exemplo de como fazer isso no código acima, ele iria me ajudar tremendamente:)

Como faço para programaticamente injetar meu próprio MSIL em um .NET compilado assembly?

[Edit para adicionar:] Para aqueles que perguntou: Eu não preciso de tempo de execução hotswapping. Sua perfeitamente bem para mim ter o aplicativo fechado, manipular a montagem, em seguida, reiniciar o programa novamente.

[Edit mais uma vez:] Parece que o consenso geral é "manipular a montagem é um mau maneira de corrigir um programa". Não vou entrar por esse caminho se o seu má idéia .

Vou deixar o aberto pergunta porque MSIL injeção ainda pode ser útil para outros fins:)

Foi útil?

Solução

Eu acho que a pergunta que eu gostaria de pedir é "como você implantar o patch"? Em algum lugar, você tem que implantar algo para corrigir um bug que já está em estado selvagem. Por que recompilar a dll e liberando a versão fixa ser realmente um problema? Meu palpite é que descobrir como programaticamente injectar MSIL vai ser mais problema do que simplesmente reimplantar um fixo de montagem.

Outras dicas

Ao invés de injetar MSIL em tempo de execução, você já pensou em inserir a fonte diretamente na montagem?

Você pode desmontar com ildasm, insira o MSIL, e depois remontá com ilasm, em seguida, implantar o produto disso.

Se a razão que você não quer reimplantar o material todo é porque é realmente metade de um show, você provavelmente deve usar algum tipo de ferramenta de patch binário - que é o primeiro resultado no Google:

Binary Diff http://www.daemonology.net/bsdiff/

Se o seu exe é assinado, em seguida, isso não seria possível. Porque você não pode apenas liberar esse conjunto único, em vez de enviar toda a aplicação novamente? Parece que você está apontando para uma solução complexa para um problema simples.

Você pode usar injeção MSIL estática. Mono Cecil ou PostSharp talvez útil.

boa fonte de informação ...

IL Programação ebook

outro é MS Press livro sobre programação IL.

passos para decompor a IL e recompilação

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

2. // modificar o código ConsoleApplication1.il

3. ilasm ConsoleApplication1.il

Você vai precisar de código não gerenciado para executar este êxito, mas isso pode ser feito ...

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top