为什么我会选择 512 以外的 C# 编译器文件对齐设置?

2024-02-19

我可以在 MS Docs 中看到如何更改 C# 编译的文件对齐方式(通过项目设置和命令行)。

我在 google 上搜索并看到文章解释 512 字节的文件对齐会减小 .dll 的大小。我用不同的文件对齐方式测试了自己,发现确实如此。

我的问题是:

为什么我想要使用不同的文件对齐方式?一定有一些场景需要这样做,否则就没有选择?

另外,它到底有什么作用? MSDN 页面谈论部分?什么是章节?

https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/advanced#filealignment


这是一个相当技术性的实现细节。首先,您必须了解 PE32 文件的结构,即 Windows 中 DLL 和 EXE 的文件格式。这方面的权威文章是 Matt Pietrik 的“Peering Inside the PE, A Tour of the Win32 Portable Executable File Format”。 17年前写的,但仍然有意义并可用 http://msdn.microsoft.com/en-us/library/ms809762.aspx.

/filealign 设置是指 IMAGE_OPTIONAL_HEADER.FileAlignment 字段的值。它决定了节中原始数据的对齐方式。节是文件中的一段代码或数据。在纯 .NET 程序集的情况下几乎都是数据。

文件格式与磁盘之间有着非常密切的关系。可执行映像用作 Windows 中内存映射文件的后备文件。通过将文件映射到虚拟内存地址空间来加载可执行文件。非常高效,加载 DLL 仅涉及创建该映射,而不从文件中读取实际数据。当进程尝试从节中读取字节时,这种情况会以惰性方式发生。如果尚未加载到内存中,则会产生页面错误,操作系统将从文件中读取 4096 字节到内存中。最大的优点是您无需为不使用的数据或代码付费。这也是第一次阅读[属性]时成本昂贵的原因。

文件对齐的相关性是各部分中的原始数据如何排列。大多数包含机器代码的现代可执行文件都使用 4096 字节的对齐方式,即虚拟内存页面的大小。这与包含托管代码的程序集关系不大,IL 只是数据。这使得使用较小的对齐方式是有意义的,这种对齐方式浪费的空间更少。 512 字节(不是千字节)是一个令人愉快的数字,它是 PE32 格式中允许的最小值。

我能想到的将选项添加到 UI 的唯一可能原因是,与其他编译器相比,C# 编译器的编译选项非常少。 “其他”是生成本机代码的编译器。所以这个选项就在那里,因为编译器有这个选项。 [属性] 涵盖了许多调整,很好地使编译器命令行变得简短而敏捷。但是文件对齐没有属性,需要在生成文件之前知道,属性就来不及了。

相反的例子是C++编译器和链接器,IDE提供nineteen属性页来设置它们。但还没有涵盖所有,真正晦涩难懂的还得在“命令行”选项页中设置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我会选择 512 以外的 C# 编译器文件对齐设置? 的相关文章

  • Mono 无法保存用户设置

    我在 Mono Ubuntu 上保存用户设置时遇到问题 这是代码示例 private void Form1 Load object sender EventArgs e string savedText Properties Setting
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Qt - 无法让 lambda 工作[重复]

    这个问题在这里已经有答案了 我有以下功能 我想在其中修剪我的std set
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • Xamarin Android:获取内存中的所有进程

    有没有办法读取所有进程 而不仅仅是正在运行的进程 如果我对 Android 的理解正确的话 一次只有一个进程在运行 其他所有进程都被冻结 后台进程被忽略 您可以使用以下代码片段获取当前正在运行的所有 Android 应用程序进程 Activ
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • std::bind 重载解析

    下面的代码工作正常 include
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 同时从多个流中捕获、最佳方法以及如何减少 CPU 使用率

    我目前正在编写一个应用程序 该应用程序将捕获大量 RTSP 流 在我的例子中为 12 个 并将其显示在 QT 小部件上 当我超过大约 6 7 个流时 问题就会出现 CPU 使用率激增并且出现明显的卡顿 我认为它不是 QT 绘制函数的原因是因
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 如何创建向后兼容 Windows 7 的缩放和尺寸更改每显示器 DPI 感知应用程序?

    我是 WPF 和 DPI 感知 API 的新手 正在编写一个在 Windows 7 8 1 和 10 中运行的应用程序 我使用具有不同每个显示器 DPI 设置的多个显示器 并且有兴趣将我的应用程序制作为跨桌面配置尽可能兼容 我已经知道可以将

随机推荐