是否可以对CLR在内存中加载的程序集模块原始文件进行读访问?

时间:2014-08-21 07:58:46

标签: .net clr .net-assembly

是否可以对CLR在内存中加载的程序集模块原始文件进行读访问?

我不在这里要求 Reflection ,我要求对CLR加载到内存中的原始模块文件(.dll和.exe)进行读访问。如果可能的话,我想我不知道某些非托管代码(并且可以使用非托管代码)。

我想这可以通过CLR hosting来完成,但是如果可能的话,我更喜欢没有CLR托管的解决方案,这是我的.NET代码会调用一些非托管代码的解决方案(输入如{ {1}})并返回一个指向内存中文件位置的指针(假设CLR没有移动这样的加载文件)。

2 个答案:

答案 0 :(得分:1)

打开文件读取程序集没有什么特别之处。 CLR不会对程序集执行任何复杂操作,它只是创建一个内存映射文件以将其映射到虚拟内存中。 非常高效,您永远不会为您不使用的元数据或MSIL付费,它将永远不会被加载到RAM中。只要您不尝试写入文件,那么您根本就没有问题:

using System;
using System.IO;

class Program {
    static void Main(string[] args) {
        using (var fs = new FileStream(System.Reflection.Assembly.GetExecutingAssembly().Location,
            FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) {
            // No problems...
        }
    }
}

这样做是否真的有用是相当值得怀疑的。您将要使用Reflection或低级.NET元数据服务(IMetadataAssemblyImport2等)来避免必须解释程序集的非平凡结构。

答案 1 :(得分:0)

我发现这可以通过这种方式获取指向内存中加载的.NET模块原始字节的指针,所以这正好回答了我的问题:

System.Reflection.Assembly assembly = ...
IntPtr modulePtr = Marshal.GetHINSTANCE(assembly.ManifestModule);