相反的操作,以集加载(字节[] rawAssembly)

问题描述 投票:6回答:3

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

我不知道是否有像byte[] Store(Assembly assembly)相反的操作。如果没有,我怎么能转换组件对象byte[]调用Assembly Load(byte[] rawAssembly)完全在内存中,而无需编写汇编到一个文件?谢谢!

评论:这个问题来自于我使用的是第三方库,它返回一个集实例对我的情况,我必须使用反射来调用它的方法。我不知道库如何创建这个装配对象。我想知道是否能存储该组件对象字节[],并用“集加载(字节[] rawAssembly)”重新装入。谢谢!

c# .net
3个回答
5
投票

System.Security.Policy.Hash能够计算哈希无论装配的位置。因此,我们至少有2种方式来获得组装件作为一个字节数组:

1)使用反射:

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

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());

2
投票

System.Reflection.Assembly实现ISerializable的。创建BinaryFormatter的实例并调用它的Serialize方法上的任何流 - MemoryStream的文件流等。

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

0
投票

一种组件,其从应用程序域转换为byte []使用:

var pi = assembly.GetType().GetMethod("GetRawBytes", BindingFlags.Instance | BindingFlags.NonPublic);
byte[] assemblyBytes = (byte[]) pi.Invoke(assembly, null);
© www.soinside.com 2019 - 2024. All rights reserved.