我注意到有一种方法System.Reflection.Assembly,即Assembly Load(byte[] rawAssembly).
我想知道是否有相反的操作byte[] Store(Assembly assembly).如果没有,如何将汇编对象转换byte[]为Assembly Load(byte[] rawAssembly)完全在内存中调用而不将汇编写入文件?谢谢!
评论:问题来自我使用第三方库的情况,该库向我返回一个Assembly实例,我必须使用反射来调用它的方法.我不知道库是如何创建这个程序集对象的.我只是想知道是否可以将汇编对象存储到byte []并使用'Assembly Load(byte [] rawAssembly)'重新加载它.谢谢!
System.Security.Policy.Hash能够计算哈希值,而与程序集的位置无关。因此,我们至少有两种方法可以将程序集获取为字节数组:
1)使用反射:
var hash = new Hash(assembly);
var dllAsArray = (byte[]) hash.GetType()
.GetMethod("GetRawData", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(hash, new object[0]);
Run Code Online (Sandbox Code Playgroud)
2)使用伪造的HashAlgorithm实现:
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());
Run Code Online (Sandbox Code Playgroud)
小智 3
System.Reflection.Assembly 实现 ISerialized。创建 BinaryFormatter 的实例并在任何流(MemoryStream、FileStream 等)上调用其 Serialize 方法。
Assembly yourAssembly;
var formatter = new BinaryFormatter();
var ms = new MemoryStream();
formatter.Serialize(ms, yourAssembly);
var reloadedAssembly = Assembly.Load(ms.GetBuffer());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |