对assembly负载的相反操作(byte rawAssembly)

我注意到有一个System.Reflection.Assembly方法,它是Assembly Load(byte[] rawAssembly)

我想知道是否存在像byte[] Store(Assembly assembly)这样的相反操作。 如果没有,我怎样才能将汇编对象转换为byte[]以完全在内存中调用Assembly Load(byte[] rawAssembly)而无需将汇编写入文件? 谢谢!

评论:问题来自我使用第三方库的情况,该库向我返回一个Assembly实例,我必须使用reflection来调用它的方法。 我不知道库是如何创建这个程序集对象的。 我只是想知道是否可以将汇编对象存储到byte []并使用’Assembly Load(byte [] rawAssembly)’重新加载它。 谢谢!

System.Security.Policy.Hash能够计算Hash而不管程序集位置。 所以我们至少有两种方法来获得汇编作为字节数组:1)使用reflection

  var hash = new Hash(assembly); var dllAsArray = (byte[]) hash.GetType() .GetMethod("GetRawData", BindingFlags.Instance | BindingFlags.NonPublic) .Invoke(hash, new object[0]); 

2)使用假HashAlgoritm实现

  public class GetWholeBodyPseudoHash : HashAlgorithm { protected override void Dispose(bool disposing) { if(disposing) _memoryStream.Dispose(); base.Dispose(disposing); } static GetWholeBodyPseudoHash() { CryptoConfig.AddAlgorithm(typeof(GetWholeBodyPseudoHash), typeof(GetWholeBodyPseudoHash).FullName); } private MemoryStream _memoryStream=new MemoryStream(); public override void Initialize() { _memoryStream.Dispose(); _memoryStream = new MemoryStream(); } protected override void HashCore(byte[] array, int ibStart, int cbSize) { _memoryStream.Write(array, ibStart, cbSize); } protected override byte[] HashFinal() { return _memoryStream.ToArray(); } } ... var bytes = new Hash(yourAssembly).GenerateHash(new GetWholeBodyPseudoHash()); 

System.Reflection.Assembly实现了ISerializable。 创建BinaryFormatter的实例并在任何流上调用其Serialize方法 – MemoryStream,FileStream等。

 Assembly yourAssembly; var formatter = new BinaryFormatter(); var ms = new MemoryStream(); formatter.Serialize(ms, yourAssembly); var reloadedAssembly = Assembly.Load(ms.GetBuffer());