Tôi sử dụng trình biên dịch csc.exe được gọi từ tập lệnh .vbs.
Trong kịch bản xyz.cs của bạn, thêm những dòng sau đây sau khi các chỉ thị (ví dụ của tôi là dành cho 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"
Tỉ, res và thẻ ico sẽ được chọn của các .vbs script dưới đây để tạo lệnh csc.
Sau đó thêm người gọi lắp ráp phân giải trong chính:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
.
... và thêm phân giải bản thân ở đâu đó trong lớp:
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
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);
}
}
Tôi đặt tên cho kịch bản vbs để phù hợp với. cs filename (ví dụ ssh.vbs tìm kiếm ssh.cs); điều này làm cho chạy kịch bản nhiều lần dễ dàng hơn nhiều, nhưng nếu bạn không phải là một thằng ngốc như tôi thì một kịch bản chung có thể lấy mục tiêu.cs tập tin từ một drag-and-drop:
Dim name_,oShell,fso
Set oShell = CreateObject("Shell.Application")
Set fso = CreateObject("Scripting.fileSystemObject")
'TAKE THE VBS SCRIPT NAME AS THE TARGET FILE NAME
'################################################
name_ = Split(wscript.ScriptName, ".")(0)
'GET THE EXTERNAL DLL's AND ICON NAMES FROM THE .CS FILE
'#######################################################
Const OPEN_FILE_FOR_READING = 1
Set objInputFile = fso.OpenTextFile(name_ & ".cs", 1)
'READ EVERYTHING INTO AN ARRAY
'#############################
inputData = Split(objInputFile.ReadAll, vbNewline)
For each strData In inputData
if left(strData,7)="//+ref>" then
csc_references = csc_references & " /reference:" & trim(replace(strData,"//+ref>","")) & " "
end if
if left(strData,7)="//+res>" then
csc_resources = csc_resources & " /resource:" & trim(replace(strData,"//+res>","")) & " "
end if
if left(strData,7)="//+ico>" then
csc_icon = " /win32icon:" & trim(replace(strData,"//+ico>","")) & " "
end if
Next
objInputFile.Close
'COMPILE THE 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)
Có thể, nhưng bạn sẽ kết thúc với thực thi lớn (Base64 sẽ được sử dụng để mã hóa dll của bạn). –
@ PawełDyda: Bạn có thể nhúng dữ liệu nhị phân thô vào một hình ảnh PE (xem [RCDATA] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa381039.aspx)). Không cần chuyển đổi (hoặc được khuyến nghị). – IInspectable