是否可以以字节数组或流的形式获取加载的 .net 程序集的内容?

eri*_*len 5 .net reflection assemblies

是否可以以字节数组或流的形式获取加载的 .net 程序集的内容?

我想做的是类似的事情(当然真实的场景要复杂得多,所以仅仅存储缓冲区不是一个选择)。

byte[] bytes = GetTheBytes();
Assembly asm = Assembly.Load(bytes);
byte[] bytes2 = GetAssemblyAsByteArray(asm);
Assert.IsTrue(bytes.SequenceEqual(bytes2));
Run Code Online (Sandbox Code Playgroud)

我需要知道如何实现 GetAssemblyAsByteArray 函数。

编辑: File.ReadAllBytes() 的解决方案不够好,因为程序集可能是动态的,不,我无法(轻松)访问源代码(它是自动生成的,我不想跟踪它)。序列化注释可能有效,但我不知道到底如何使用它。我的最终目标是将程序集作为 /reference 选项传递给 csc.exe,并且我认为无论程序集是否动态,其工作等效的唯一方法是将所有需要的程序集保存到临时文件。

adr*_*nks 3

您可以使用:

byte[] bytes = File.ReadAllBytes(assembly.Location);
Run Code Online (Sandbox Code Playgroud)

在已经加载的程序集上,它会给你一个byte[]适合传递给Assembly.Load(byte[]).

但是,如果程序集最初是使用该Load(byte[])方法加载的,则其Location属性将为空字符串,这意味着该方法将不起作用。

看起来没有一种方法可以为所有程序集执行您想要的操作。显而易见的解决方法是在您第一次获得原始文件时存储它byte[]