J'utilise le compilateur csc.exe appelé à partir d'un script .vbs.
Dans votre script xyz.cs, ajoutez les lignes suivantes après les directives (mon exemple est pour le Renci SSH):
using System;
using Renci;//FOR THE SSH
using System.Net;//FOR THE ADDRESS TRANSLATION
using System.Reflection;//FOR THE Assembly
//+ref>"C:\Program Files (x86)\Microsoft\ILMerge\Renci.SshNet.dll"
//+res>"C:\Program Files (x86)\Microsoft\ILMerge\Renci.SshNet.dll"
//+ico>"C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2 SDK\Samples\c_sharp\xmldsig\resources\Traffic.ico"
Les balises ref, res et ico seront récupérées par le script .vbs ci-dessous pour former la commande csc.
Ajoutez ensuite l'appelant du résolveur d'assembly dans le Main:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
.
... et ajoutez le résolveur lui-même quelque part dans la classe:
static Assembly CurrentDomain_AssemblyResolve (expéditeur d'objet, arguments ResolveEventArgs)
{
String resourceName = new AssemblyName (args.Name) .Name + ".dll";
utilisant (var stream = Assembly.GetExecutingAssembly (). GetManifestResourceStream (resourceName))
{
Byte [] assemblyData = new Byte [stream.Length];
stream.Read (assemblyData, 0, assemblyData.Length);
return Assembly.Load (assemblyData);
}
}
Je nomme le script vbs pour qu'il corresponde au nom du fichier .cs (par exemple, ssh.vbs recherche ssh.cs); cela rend l'exécution du script plusieurs fois beaucoup plus facile, mais si vous n'êtes pas un idiot comme moi, un script générique pourrait récupérer le fichier .cs cible à partir d'un glisser-déposer:
Dim name_, oShell, fso
Définissez oShell = CreateObject ("Shell.Application")
Définissez fso = CreateObject ("Scripting.fileSystemObject")
'PRENEZ LE NOM DU SCRIPT VBS COMME NOM DU FICHIER CIBLE
'################################################
name_ = Split (wscript.ScriptName, ".") (0)
'OBTENEZ LES DLL EXTERNES ET LES NOMS DES ICÔNES DU FICHIER .CS
«################################################# ######
Const OPEN_FILE_FOR_READING = 1
Définissez objInputFile = fso.OpenTextFile (name_ & ".cs", 1)
'LISEZ TOUT DANS UN RÉSEAU
«#############################
inputData = Split (objInputFile.ReadAll, vbNewline)
Pour chaque strData In inputData
si laissé (strData, 7) = "// + ref>" alors
csc_references = csc_references & "/ reference:" & trim (replace (strData, "// + ref>", "")) & ""
fin si
si laissé (strData, 7) = "// + res>" alors
csc_resources = csc_resources & "/ resource:" & trim (replace (strData, "// + res>", "")) & ""
fin si
si laissé (strData, 7) = "// + ico>" alors
csc_icon = "/ win32icon:" & trim (replace (strData, "// + ico>", "")) & ""
fin si
Prochain
objInputFile.Close
«COMPILER LE FICHIER
«################
oShell.ShellExecute "c: \ windows \ microsoft.net \ framework \ v3.5 \ csc.exe", "/ warn: 1 / target: exe" & csc_references & csc_resources & csc_icon & "" & name_ & ".cs" , "", "runas", 2
WScript.Quit (0)