如何将程序集对象序列化/反序列化为字节数组
假设通过编译代码字符串在内存中创建(可执行)程序集。 然后我想将此程序集对象序列化为字节数组,然后将其存储在数据库中。 然后,我想从数据库中检索字节数组,并将字节数组反序列化为一个程序集对象,然后调用程序集的入口点。
起初我只是尝试像.net中的任何其他简单对象那样执行此序列化,但显然这不适用于程序集对象。 程序集对象包含一个名为GetObjectData的方法,该方法获取重新实例化程序集所需的序列化数据。 所以我有点困惑的是我如何将这一切拼凑起来用于我的场景。
答案只需要展示如何获取程序集对象,将其转换为字节数组,将其转换回程序集,然后在反序列化程序集上执行entry方法。
程序集更方便地简单地表示为二进制dll文件。 如果你这样想的话,剩下的问题就会消失。 具体来说,请查看Assembly.Load(byte[])
以从二进制文件加载 Assembly
。 要将其写为二进制文件,请使用CompileAssemblyFromSource
并查看结果的PathToAssembly
– 然后查看File.ReadAllBytes(path)
以从文件中获取二进制文件。
System.Reflection.Assembly
是ISerializable
,可以简单地序列化,如下所示:
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”,它返回汇编字节。