首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装配件装入的相反工序(byte[] rawAssembly)

装配件装入的相反工序(byte[] rawAssembly)
EN

Stack Overflow用户
提问于 2013-06-02 22:27:18
回答 3查看 2.8K关注 0票数 11

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

我想知道是否有像byte[] Store(Assembly assembly)这样的相反操作。如果不是,我如何将程序集对象转换为byte[],以便完全在内存中调用Assembly Load(byte[] rawAssembly),而不将程序集写入文件?谢谢!

备注:这个问题来自于我使用的第三方库返回一个Assembly实例,并且我必须使用反射来调用它的方法。我不知道这个库是如何创建这个组装对象的。我只是想知道是否可以将程序集对象存储到byte[]中,并使用“assembly Load(byte[] rawAssembly)”重新加载它。谢谢!

EN

回答 3

Stack Overflow用户

发布于 2017-09-14 10:50:43

无论程序集的位置如何,System.Security.Policy.Hash都能够计算哈希。因此,我们至少有两种方法可以将程序集获取为字节数组:

1)使用反射:

代码语言:javascript
复制
var hash = new Hash(assembly);
var dllAsArray = (byte[]) hash.GetType()
    .GetMethod("GetRawData", BindingFlags.Instance | BindingFlags.NonPublic)
    .Invoke(hash, new object[0]);

2)使用伪HashAlgorithm实现:

代码语言:javascript
复制
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());
票数 5
EN

Stack Overflow用户

发布于 2019-01-26 04:02:42

要将程序集从AppDomain转换为byte[],请使用:

代码语言:javascript
复制
var pi = assembly.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic);
byte[] assemblyBytes = (byte[]) pi.Invoke(assembly, null);
票数 3
EN

Stack Overflow用户

发布于 2013-06-03 11:09:51

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

代码语言:javascript
复制
Assembly yourAssembly;
var formatter = new BinaryFormatter();
var ms = new MemoryStream();
formatter.Serialize(ms, yourAssembly);
var reloadedAssembly = Assembly.Load(ms.GetBuffer()); 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16883687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档