.Net程序集的不同加载方式,以及其在内存中格式

简介: .Net程序集除了正常的有框架自动按需载入外,我们还可以通过反射手动载入程序集。 其中反射载入程序集有一种方式就是 以字节流的方式载入程序集。而不是直接从磁盘文件载入。 很多.Net压缩壳,和整体保护壳都采用了这种方式。
.Net程序集除了正常的有框架自动按需载入外,我们还可以通过反射手动载入程序集。
其中反射载入程序集有一种方式就是 以字节流的方式载入程序集。而不是直接从磁盘文件载入。
很多.Net压缩壳,和整体保护壳都采用了这种方式。

这种方式载入的程序集和从磁盘文件载入的程序集,其内存属性是不一样的。
字节流载入的内存属性是 MEM_MAPPED .
文件方式载入的内存属性是   MEM_IMAGE 。
(注:指使用api函数 VirtualQuery 获取的内存信息)

在 .Net 1.1中 这两种内存影像的布局是一样的,都是按照pe header的sections进行了内存映射的。

但是在 .Net 2.0 中这种情况变化了,字节流加载的程序集。在内存中的布局和它原始的字节流一样。没有按照pe header进行section的映射。

如果要进行程序集的整体dump,就需要考虑这两种不同的加载模式。
字节流加载的程序集,在获取Assembly的Location属性时会异常。

加密壳加密后的程序集,如果需要兼容后续使用压缩壳或整体加密壳再次保护,也需要在运行时考虑这种情况。
DNGuard 从2.6起就已经考虑处理了这种情况。
目录
相关文章
|
NoSQL 测试技术
内存程序崩溃
【10月更文挑战第13天】
666 62
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
1215 13
|
C语言 Android开发 C++
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
本文介绍了使用MTuner软件进行Qt MinGW编译程序的内存泄漏检测的方法,提供了MTuner的下载链接和测试代码示例,并通过将Debug程序拖入MTuner来定位内存泄漏问题。
684 4
基于MTuner软件进行qt的mingw编译程序的内存泄漏检测
|
存储 程序员 编译器
简述 C、C++程序编译的内存分配情况
在C和C++程序编译过程中,内存被划分为几个区域进行分配:代码区存储常量和执行指令;全局/静态变量区存放全局变量及静态变量;栈区管理函数参数、局部变量等;堆区则用于动态分配内存,由程序员控制释放,共同支撑着程序运行时的数据存储与处理需求。
936 22
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
816 1
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
491 5
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
951 4
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
数据库连接 开发者
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第15天】在.NET中,有两种有效的资源释放方式:一是使用`using`语句,适用于实现`IDisposable`接口的对象,如文件流、数据库连接等,能确保资源及时释放,避免泄漏;二是手动调用`Dispose`方法并处理异常,提供更灵活的资源管理方式,适用于复杂场景。这两种方式都能有效管理资源,提高应用性能和稳定性。
532 2
|
算法 Java 数据库连接
.NET 内存管理两种有效的资源释放方式
【10月更文挑战第14天】在 .NET 中,`IDisposable` 接口提供了一种标准机制来释放非托管资源,如文件句柄、数据库连接等。此类资源需手动释放以避免泄漏。实现 `IDisposable` 的类可通过 `Dispose` 方法释放资源。使用 `using` 语句可确保资源自动释放。此外,.NET 的垃圾回收器会自动回收托管对象所占内存,提高程序效率。示例代码展示了如何使用 `MyFileHandler` 类处理文件操作并释放 `FileStream` 资源。
418 2