Made some work...
// Thanks for Visual C# Kicks Memory Launcher Sample
//
// Used 7zxa.dll (170 kb) which is very light version of the original 7z.dll (1.3 Mb)
// Still, it's a plus 450+ kb (32,64-bit 7zip Lib + SevenZipSharp Lib)
// So don't use it if your exe is not really so big.
using System;
using System.IO;
using System.Reflection;
using SevenZip;
namespace MemoryLauncher
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
if (IntPtr.Size == 8)
{
string dizin = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\7zxa.dll";
ExtractResource("7z64.dll", dizin);
SevenZip.SevenZipBase.SetLibraryPath(dizin);
}
else
{
string dizin = Environment.GetFolderPath(Environment.SpecialFolder.System) + @"\7zxa.dll";
ExtractResource("7z.dll", dizin);
SevenZip.SevenZipBase.SetLibraryPath(dizin);
}
RunInternal7z("MemoryLauncher.SomeSevenZip.7z");
//RunInternal7z(Properties.Resources.SomeSevenZip);
}
private static void ExtractResource(byte[] resBuffer, string dizin)
{
BinaryWriter writer = new BinaryWriter(File.Open(dizin, FileMode.OpenOrCreate, FileAccess.Write));
writer.Write(resBuffer);
writer.Close();
}
private static void ExtractResource(string resName, string dizin)
{
//Get the current assembly
Assembly assembly = Assembly.GetExecutingAssembly();
//If you're using ILMerge assembly name will be different
//So the resource won't be extracted
//Dont' use this
//
//Get the assembly's root name
//string rootName = assembly.GetName().Name;
//Get the resource stream
Stream resourceStream = assembly.GetManifestResourceStream(resName);
//Read the raw bytes of the resource
byte[] resourcesBuffer = new byte[resourceStream.Length];
resourceStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
resourceStream.Close();
BinaryWriter writer = new BinaryWriter(File.Open(dizin, FileMode.OpenOrCreate, FileAccess.Write));
writer.Write(resourcesBuffer);
writer.Close();
}
private static void RunInternal7z(byte[] zipBuffer)
{
var zipStream = new MemoryStream();
zipStream.Seek(0, 0);
zipStream.Write(zipBuffer, 0, zipBuffer.Length);
//Extract 7zip file and load it into the memory
var _7z = new SevenZipExtractor(zipStream);
var memStream = new MemoryStream();
_7z.ExtractFile(0, memStream);
zipStream.Close();
//Read the raw bytes of the resource
byte[] resourcesBuffer = new byte[memStream.Length];
memStream.Seek(0, 0); //Really needed//
memStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
memStream.Close();
//Load the bytes as an assembly
Assembly exeAssembly = Assembly.Load(resourcesBuffer);
//Execute the assembly
exeAssembly.EntryPoint.Invoke(null, null); //no parameters
}
private static void RunInternal7z(string zipName)
{
//Get the current assembly
Assembly assembly = Assembly.GetExecutingAssembly();
//If you're using ILMerge assembly name will be different
//So the resource won't be extracted
//Dont' use this
//
//Get the assembly's root name
//string rootName = assembly.GetName().Name;
//Get the resource stream
Stream resourceStream = assembly.GetManifestResourceStream(zipName);
//Extract 7zip file and load it into the memory
var _7z = new SevenZipExtractor(resourceStream);
var memStream = new MemoryStream();
_7z.ExtractFile(0, memStream);
//Read the raw bytes of the resource
byte[] resourcesBuffer = new byte[memStream.Length];
memStream.Seek(0, 0); //Really needed//
memStream.Read(resourcesBuffer, 0, resourcesBuffer.Length);
memStream.Close();
//Load the bytes as an assembly
Assembly exeAssembly = Assembly.Load(resourcesBuffer);
//Execute the assembly
exeAssembly.EntryPoint.Invoke(null, null); //no parameters
}
}
}