Ce projet implémente une bibliothèque d'injection .NET Assembly (elle s'inspire du projet snoopwpf). Le processus distant peut être géré ou non.
Lorsque vous souhaitez injecter un assembly dans un processus distant, vous devez prendre en compte les aspects suivants :
Si les conditions préalables ci-dessus sont remplies, vous pouvez injecter un assembly et appeler une méthode d'activation. Il existe trois possibilités pour invoquer la méthode d'activation :
Cette bibliothèque est également utilisée par Shed pour injecter une DLL dans un processus distant. Vous pouvez voir une vidéo ici.
Pour des exemples pratiques, voir le projet TestRunner.
Si l'assembly injecté a des dépendances sur des assemblys .NET non standard, vous pouvez ajouter ces dépendances avec la méthode AddDependency
.
Si l'assembly injecté doit charger un fichier externe pour fonctionner correctement (comme un fichier de configuration), vous pouvez les spécifier avec la méthode AddFile
. Cette méthode copiera le fichier spécifié dans le répertoire de travail du processus injecté.
Dans certains cas, il est nécessaire de passer un argument à la méthode appelée dans l'assembly injecté. Ceci est réalisé en passant un objet context
à la méthode Inject
. Ensuite, la méthode Injected
doit convertir l'objet context
en type réel (voir AssemblyWithMethodAcceptingAnArgument
pour un exemple). Le framework utilise la classe BinaryFormatter
pour sérialiser l'objet context
, assurez-vous donc que l'objet spécifié peut être sérialisé.
Considérons le code suivant :
using System;
namespace InjectedAssembly
{
public class Main
{
// we use a default injection method name in order to execute our code in the remote process
private static void Inject()
{
Console.WriteLine("Hello world from the injected process!");
}
}
}
afin d'injecter l'Assembly généré à partir du code ci-dessus il suffit d'utiliser le code suivant :
var pid = 1234;
var injector = new Injector(pid, Assembly.LoadFile("AssemblyToInject.dll"));
var injectionResult = injector.Inject();
Pour plus d'exemples, consultez le dossier d'exemples.
ManagedInjector est actuellement développé à l'aide de VisualStudio 2017 Community Edition (assurez-vous d'avoir la dernière version installée). Pour construire le code source, assurez-vous de :
build.bat
Nous utilisons SemVer pour le versioning. Pour les versions disponibles, voir les balises sur ce référentiel.
Managed Injector est sous licence Creative Commons.