Eu uso o compilador csc.exe chamado de um script .vbs.
No seu script xyz.cs, adicione as seguintes linhas após as diretivas (meu exemplo é para o 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"
As tags ref, res e ico serão selecionadas pelo script .vbs abaixo para formar o comando csc.
Em seguida, adicione o chamador do resolvedor de montagem no Principal:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
.
... e adicione o resolvedor em algum lugar da classe:
static Assembly CurrentDomain_AssemblyResolve (remetente do objeto, args ResolveEventArgs)
{
String resourceName = new AssemblyName (args.Name) .Name + ".dll";
usando (var stream = Assembly.GetExecutingAssembly (). GetManifestResourceStream (resourceName))
{
Byte [] assemblyData = novo Byte [stream.Length];
stream.Read (assemblyData, 0, assemblyData.Length);
retornar Assembly.Load (assemblyData);
}
}
Eu nomeio o script vbs para corresponder ao nome do arquivo .cs (por exemplo, ssh.vbs procura por ssh.cs); isso facilita muito a execução do script, mas se você não for um idiota como eu, um script genérico poderá capturar o arquivo .cs de destino em um arrastar e soltar:
Dim name_, oShell, fso
Defina oShell = CreateObject ("Shell.Application")
Defina fso = CreateObject ("Scripting.fileSystemObject")
TOME O NOME DO SCRIPT DO VBS COMO NOME DO ARQUIVO-ALVO
'########################################################
nome_ = Dividir (wscript.ScriptName, ".") (0)
'OBTENHA OS DLLs EXTERNOS E OS NOMES DE ÍCONE DO ARQUIVO .CS
'######################################################### ######
Const OPEN_FILE_FOR_READING = 1
Defina objInputFile = fso.OpenTextFile (nome_ & ".cs", 1)
LEIA TUDO EM UMA DISPOSIÇÃO
'#############################
inputData = Split (objInputFile.ReadAll, vbNewline)
Para cada strData Em inputData
se esquerda (strData, 7) = "// + ref>" então
csc_references = csc_references & "/ reference:" & trim (substitua (strData, "// + ref>", "")) & ""
fim se
se esquerda (strData, 7) = "// + res>" então
csc_resources = csc_resources & "/ resource:" & trim (substituir (strData, "// + res>", "")) e ""
fim se
se esquerda (strData, 7) = "// + ico>" então
csc_icon = "/ win32icon:" & aparar (substituir (strData, "// + ico>", "")) & ""
fim se
Próximo
objInputFile.Close
COMPILAR O ARQUIVO
'################
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)