Uso el compilador csc.exe llamado desde un script .vbs.
En su script xyz.cs, agregue las siguientes líneas después de las directivas (mi ejemplo es para 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"
Las etiquetas ref, res e ico serán recogidas por el script .vbs a continuación para formar el comando csc.
Luego agregue el llamador de resolución de ensamblaje en Main:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
.
... y agregue el resolutor en algún lugar de la clase:
Ensamblado estático CurrentDomain_AssemblyResolve (remitente del objeto, argumentos ResolveEventArgs)
{
Cadena resourceName = new AssemblyName (args.Name) .Name + ".dll";
utilizando (var stream = Assembly.GetExecutingAssembly (). GetManifestResourceStream (resourceName))
{
Byte [] assemblyData = nuevo Byte [stream.Length];
stream.Read (assemblyData, 0, assemblyData.Length);
return Assembly.Load (assemblyData);
}
}
Nombro el script vbs para que coincida con el nombre de archivo .cs (por ejemplo, ssh.vbs busca ssh.cs); esto hace que ejecutar el script muchas veces sea mucho más fácil, pero si no eres un idiota como yo, entonces un script genérico podría recoger el archivo .cs de destino con una función de arrastrar y soltar:
Dim name_, oShell, fso
Establecer oShell = CreateObject ("Shell.Application")
Establecer fso = CreateObject ("Scripting.fileSystemObject")
'TOMA EL NOMBRE DEL SCRIPT DE VBS COMO EL NOMBRE DEL ARCHIVO OBJETIVO
'################################################
name_ = Split (wscript.ScriptName, ".") (0)
'OBTENGA LOS DLL EXTERNOS Y LOS NOMBRES DE ICONOS DEL ARCHIVO .CS
'################################################# ######
Const OPEN_FILE_FOR_READING = 1
Establezca objInputFile = fso.OpenTextFile (name_ & ".cs", 1)
'LEA TODO EN UN ARRAY
'#############################
inputData = Split (objInputFile.ReadAll, vbNewline)
Para cada strData en inputData
if left (strData, 7) = "// + ref>" entonces
csc_references = csc_references & "/ reference:" & trim (replace (strData, "// + ref>", "")) & ""
terminara si
if left (strData, 7) = "// + res>" entonces
csc_resources = csc_resources & "/ resource:" & trim (replace (strData, "// + res>", "")) & ""
terminara si
if left (strData, 7) = "// + ico>" entonces
csc_icon = "/ win32icon:" & trim (replace (strData, "// + ico>", "")) & ""
terminara si
próximo
objInputFile.Close
'COMPILAR EL ARCHIVO
'################
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)