如何在不接触磁盘的情况下将 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 直接反映到内存中即可。 我相信在那之后天空是极限。