Uso il compilatore csc.exe chiamato da uno script .vbs.
Nel tuo script xyz.cs, aggiungi le seguenti righe dopo le direttive (il mio esempio è per 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"
I tag ref, res e ico saranno raccolti dallo script .vbs in basso per formare il comando csc.
Quindi aggiungere il chiamante del resolver dell'assembly nel Main:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
.
... e aggiungi il risolutore stesso da qualche parte nella classe:
assembly statico CurrentDomain_AssemblyResolve (mittente oggetto, argomenti ResolveEventArgs)
{
String resourceName = new AssemblyName (args.Name) .Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly (). GetManifestResourceStream (resourceName))
{
Byte [] assemblyData = new Byte [stream.Length];
stream.Read (assemblyData, 0, assemblyData.Length);
return Assembly.Load (assemblyData);
}
}
Il nome dello script vbs corrisponde al nome file .cs (ad es. Ssh.vbs cerca ssh.cs); questo rende l'esecuzione dello script molte volte molto più semplice, ma se non sei un idiota come me, uno script generico potrebbe raccogliere il file .cs di destinazione da un trascinamento della selezione:
Dim nome_, oShell, fso
Set oShell = CreateObject ("Shell.Application")
Set fso = CreateObject ("Scripting.fileSystemObject")
'TRATTARE IL NOME SCRIPT VBS COME NOME FILE TARGET
'################################################
name_ = Split (wscript.ScriptName, ".") (0)
'OTTIENI I NOME DELLE ICONE E DELLE ICONE ESTERNE DAL FILE .CS
'################################################# ######
Const OPEN_FILE_FOR_READING = 1
Set objInputFile = fso.OpenTextFile (name_ & ".cs", 1)
'LEGGI TUTTO IN UN ARRAY
'#############################
inputData = Split (objInputFile.ReadAll, vbNewline)
Per ogni strData In inputData
se lasciato (strData, 7) = "// + ref>" allora
csc_references = csc_references & "/ reference:" & trim (replace (strData, "// + ref>", "")) & ""
finisci se
se lasciato (strData, 7) = "// + res>" allora
csc_resources = csc_resources & "/ resource:" & trim (replace (strData, "// + res>", "")) & ""
finisci se
se lasciato (strData, 7) = "// + ico>" allora
csc_icon = "/ win32icon:" & trim (sostituisci (strData, "// + ico>", "")) & ""
finisci se
Il prossimo
objInputFile.Close
'COMPILA IL FILE
'################
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)