在使用库方面,C/C++/Objective-C 与 C# 相比如何?

2024-02-13

这个问题是基于之前的一个问题:C# 编译如何避免需要头文件? https://stackoverflow.com/questions/1917935/how-does-c-compilation-get-around-needing-header-files.

确认 C# 编译使用多次传递基本上回答了我最初的问题。此外,答案表明 C# 使用存储在程序集中的类型和方法签名元数据在编译时检查代码语法。

Q:C/C++/Objective-C 如何知道在运行时加载哪些在编译时链接的代码?为了将其与我熟悉的技术结合起来,C#/CLR 是如何做到这一点的?

如果我错了,请纠正我,但对于 C#/CLR,我的直观理解是在执行时检查某些路径是否有程序集,并且基本上所有代码都是在运行时动态加载和链接的。

编辑:更新为包含 C++ 和 Objective-C 以及 C。

Update:为了澄清,我真正好奇的是 C/C++/Objective-C 编译如何将源代码中的“外部定义”符号与该代码的实际实现相匹配,编译输出是什么,以及编译输出基本上是如何由微处理器执行,将控制无缝传递到库代码中(就指令指针而言)。我已经使用 CLR 虚拟机完成了此操作,但很想知道它在概念上如何在实际微处理器上的 C++/Objective-C 中工作。


链接器在 C/C++ 构建中解决外部依赖关系方面发挥着重要作用。 .NET 语言不使用链接器。

有两种外部依赖项,其实现可在链接时在作为链接器的输入提供的另一个 .obj 或 .lib 文件中使用。以及在另一个可执行模块中可用的那些。 Windows 中的 DLL。

链接器在链接时解析第一个,没有发生任何复杂的事情,因为链接器知道依赖项的地址。后一步高度依赖于平台。在 Windows 上,必须为链接器提供导入库。一个非常简单的文件,仅声明 DLL 的名称以及 DLL 中导出的定义的列表。链接器通过在代码中输入跳转并向外部依赖表添加一条记录来指示跳转位置,以便可以在运行时对其进行修补,从而解决依赖关系。 DLL 的加载和导入表的设置是由 Windows 加载程序在运行时完成的。这是整个过程的鸟瞰图,有很多无聊的细节可以让这一切尽快发生。

在托管代码中,所有这些都是在运行时由 JIT 编译器驱动完成的。它将 IL 转换为由程序执行驱动的机器代码。每当执行引用另一种类型的代码时,JIT 编译器就会立即采取行动,加载该类型并转换该类型的被调用方法。加载类型的副作用是加载包含该类型的程序集(如果之前未加载过)。

值得注意的是构建时可用的外部依赖项的差异。 C/C++ 编译器一次编译一个源文件,依赖关系由链接器解析。托管编译器通常将创建程序集的所有源文件作为输入,而不是一次编译一个。实际上支持单独的编译和链接(.netmodule 和 al.exe),但可用工具没有很好地支持,因此很少这样做。此外,它不支持扩展方法和分部类等功能。因此,托管编译器需要更多的系统资源来完成工作。可以在现代硬件上轻松使用。 C/C++ 的构建过程是在那些资源不可用的时代建立的。

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

在使用库方面,C/C++/Objective-C 与 C# 相比如何? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 重载<<的返回值

    include
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐