如何将程序集对象序列化/反序列化为字节数组

假设通过编译代码字符串在内存中创建(可执行)程序集。 然后我想将此程序集对象序列化为字节数组,然后将其存储在数据库中。 然后,我想从数据库中检索字节数组,并将字节数组反序列化为一个程序集对象,然后调用程序集的入口点。

起初我只是尝试像.net中的任何其他简单对象那样执行此序列化,但显然这不适用于程序集对象。 程序集对象包含一个名为GetObjectData的方法,该方法获取重新实例化程序集所需的序列化数据。 所以我有点困惑的是我如何将这一切拼凑起来用于我的场景。

答案只需要展示如何获取程序集对象,将其转换为字节数组,将其转换回程序集,然后在反序列化程序集上执行entry方法。

程序集更方便地简单地表示为二进制dll文件。 如果你这样想的话,剩下的问题就会消失。 具体来说,请查看Assembly.Load(byte[])以从二进制文件加载 Assembly 。 要将其为二进制文件,请使用CompileAssemblyFromSource并查看结果的PathToAssembly – 然后查看File.ReadAllBytes(path)以从文件中获取二进制文件。

System.Reflection.AssemblyISerializable ,可以简单地序列化,如下所示:

 Assembly asm = Assembly.GetExecutingAssembly(); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream stream = new MemoryStream(); formatter.Serialize(stream, asm); 

和反序列化同样简单,但调用BinaryFormatter.Deserialize

使用reflection获取汇编字节的脏技巧:

  MethodInfo pi = assembly.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic); object o = pi.Invoke(assembly, null); byte[] assemblyBytes = (byte[])o; 

说明:至少在我的示例中(程序集是从字节数组加载的),程序集实例的类型为“System.Reflection.RuntimeAssembly”。 这是一个内部类,因此只能使用reflection访问它。 “RuntimeAssembly”有一个方法“GetRawBytes”,它返回汇编字节。