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

Bea*_*ker 4 c# serialization system.reflection deserialization

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

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

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

wkn*_*auf 5

使用反射获取程序集字节的肮脏技巧:

  MethodInfo methodGetRawBytes = assembly.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic);
  object o = methodGetRawBytes.Invoke(assembly, null);
  
  byte[] assemblyBytes = (byte[])o;
Run Code Online (Sandbox Code Playgroud)

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

  • GetRawBytes 在较新的 .net 版本中不再存在 (https://github.com/dotnet/runtime/issues/28132#issue-558436811) (2认同)