是否可以对CLR在内存中加载的程序集模块原始文件进行读访问?
我不在这里要求 Reflection ,我要求对CLR加载到内存中的原始模块文件(.dll和.exe)进行读访问。如果可能的话,我想我不知道某些非托管代码(并且可以使用非托管代码)。
我想这可以通过CLR hosting来完成,但是如果可能的话,我更喜欢没有CLR托管的解决方案,这是我的.NET代码会调用一些非托管代码的解决方案(输入如{ {1}})并返回一个指向内存中文件位置的指针(假设CLR没有移动这样的加载文件)。
答案 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);