如何在不接触磁盘的情况下将 assembly.load(byte[]) 管理的 dll 存入内存
How to assembly.load(byte[]) managed dll to memory, without touching the disk
您好,我目前正在尝试解决有关我正在开发的软件的问题。
我想达到的目的:从byte[]中加载一个dll到内存流中而不用WriteAllBytes(意思是我想避免接触磁盘)。
我试了很多方法都失败了。我认为我成功地将 byte[] 加载到内存中,但我编译的可执行文件仍在寻找从磁盘而不是内存加载它。如何让它从内存中加载出来才能使用?
让我们进入代码。
WebClient client = new WebClient();
string b64strbin = client.DownloadString("URL OF A FILE WHERE IT CONTAINS BYTE[]"); // this will download the string and store it to a variable.
byte[] decode = Convert.FromBase64String(b64strbin); // just decode it from base64 back to byte[]
byte[] packed = QuickLZ.decompress(decode); // decompressed dll byte[] (dont mind about this)
Assembly.Load(packed); // here i am loading the byte[] to the memory but still i get an exception
//methods that require the dll in order to run
Console.Read();
我尝试 运行. 时出现异常
我终于能够通过处理异常来解决问题。
我所要做的就是手动解析 dll 引用并用 Assembly.Load
.
加载 byte[]
解法:
static void Main()
{
try
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
//code that depends on the methods of the dll
//we reflect on memory.
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.Read();
}
}
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
try
{
WebClient client = new WebClient();
string b64strbin = client.DownloadString("URL OF A FILE WHERE IT CONTAINS BYTE[]");
byte[] decode = Convert.FromBase64String(b64strbin);
return Assembly.Load(QuickLZ.decompress(decode));
}
catch (Exception ex)
{
return null;
}
}
结论: 这样做之后你能取得的成就真是太神奇了,我的意思是你可以使用任何依赖的可执行文件并包含 dll 而无需触及磁盘,甚至将其作为嵌入式资源,只需使用 client.DownloadString
将 dll 直接反映到内存中即可。 我相信在那之后天空是极限。
您好,我目前正在尝试解决有关我正在开发的软件的问题。
我想达到的目的:从byte[]中加载一个dll到内存流中而不用WriteAllBytes(意思是我想避免接触磁盘)。
我试了很多方法都失败了。我认为我成功地将 byte[] 加载到内存中,但我编译的可执行文件仍在寻找从磁盘而不是内存加载它。如何让它从内存中加载出来才能使用?
让我们进入代码。
WebClient client = new WebClient();
string b64strbin = client.DownloadString("URL OF A FILE WHERE IT CONTAINS BYTE[]"); // this will download the string and store it to a variable.
byte[] decode = Convert.FromBase64String(b64strbin); // just decode it from base64 back to byte[]
byte[] packed = QuickLZ.decompress(decode); // decompressed dll byte[] (dont mind about this)
Assembly.Load(packed); // here i am loading the byte[] to the memory but still i get an exception
//methods that require the dll in order to run
Console.Read();
我尝试 运行. 时出现异常
我终于能够通过处理异常来解决问题。
我所要做的就是手动解析 dll 引用并用 Assembly.Load
.
解法:
static void Main()
{
try
{
AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly;
//code that depends on the methods of the dll
//we reflect on memory.
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
Console.Read();
}
}
private static Assembly OnResolveAssembly(object sender, ResolveEventArgs args)
{
try
{
WebClient client = new WebClient();
string b64strbin = client.DownloadString("URL OF A FILE WHERE IT CONTAINS BYTE[]");
byte[] decode = Convert.FromBase64String(b64strbin);
return Assembly.Load(QuickLZ.decompress(decode));
}
catch (Exception ex)
{
return null;
}
}
结论: 这样做之后你能取得的成就真是太神奇了,我的意思是你可以使用任何依赖的可执行文件并包含 dll 而无需触及磁盘,甚至将其作为嵌入式资源,只需使用 client.DownloadString
将 dll 直接反映到内存中即可。 我相信在那之后天空是极限。