Question

Disons que j'ai une application buggy comme ceci:

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

L'application est déjà compilé et déployé dans la nature. Quelqu'un a trouvé le bogue, et maintenant ils demandent une solution pour elle. Alors que je pouvais à nouveau déployer cette application avec le correctif, ses tracas d'une extrême pour des raisons en dehors de mon contrôle -. Je veux juste écrire un patch pour le bug à la place

Plus précisément, je veux insérer mon MSIL dans le fichier incriminé source assmembly. Je ne l'ai jamais fait quelque chose comme ça avant, et googler n'a pas retroussé toute information utile. Si je pouvais voir un échantillon de la façon de le faire sur le code ci-dessus, il me aider énormément:)

Comment puis-je injecter mon propre programme MSIL dans un ensemble de .NET compilé?

[Modifier pour ajouter:] Pour ceux qui lui demandaient: Je ne ai pas besoin d'exécution hotswapping. Son parfaitement bien pour moi d'avoir l'application fermée, manipuler l'assemblage, puis redémarrez à nouveau le programme.

[Modifier une fois de plus:] Il semble que le consensus général est « manipulait l'ensemble est une mauvaise façon pour patcher un programme ». Je ne vais pas dans cette voie si son mauvaise idée .

Je vais laisser la question ouverte parce que l'injection MSIL pourrait encore être utile à d'autres fins:)

Était-ce utile?

La solution

Je suppose que la question que je pose est « comment voulez-vous déployer le patch »? , Vous avez quelque part à déployer quelque chose pour corriger un bug qui est déjà dans la nature. Pourquoi serait recompiler le dll et de libérer la version fixe vraiment être un problème? Je pense que trouver comment injecter programatically MSIL va être plus de mal que redéployant simplement un ensemble fixe.

Autres conseils

Au lieu d'injecter MSIL lors de l'exécution, avez-vous envisagé d'insérer directement la source dans l'ensemble?

Vous pouvez démonter avec ildasm, insérez votre MSIL, puis réassembler avec ilasm, puis déployer le produit de cela.

Si la raison pour laquelle vous ne voulez pas de redéployer l'ensemble des choses est parce qu'il est vraiment un demi-concert, vous devriez probablement utiliser une sorte d'outil de patch binaire - qui est le premier résultat sur Google:

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

Si votre exe est signé alors ce ne serait pas possible. Pourquoi ne pouvez pas vous libérer juste que seul ensemble, au lieu d'expédition à nouveau l'ensemble de l'application? Il semble que vous visez une solution complexe pour un problème simple.

Vous pouvez utiliser l'injection statique MSIL. Mono ou Cecil PostSharp peut-être utile.

bonne source d'information ...

IL Programmation

est un autre livre MS Press sur la programmation IL.

étapes de décompilation pour IL et recompiler

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

2. // modifier le code ConsoleApplication1.il

3. ilasm ConsoleApplication1.il

Vous aurez besoin du code non managé pour effectuer cette avec succès, mais il peut être fait ...

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top