【问题标题】:Marshaling – what is it and why do we need it?编组——它是什么,我们为什么需要它?
【发布时间】:2011-01-15 11:55:08
【问题描述】:

什么是编组,我们为什么需要它?

我很难相信我不能通过从 C# 到 C 的线路发送 int 并且必须编组它。为什么 C# 不能只发送 32 位的起始和终止信号,告诉 C 代码它已收到 int

如果有任何关于我们为什么需要编组以及如何使用它的好的教程或网站,那就太好了。

【问题讨论】:

  • 事实上,您可以只发送带有起始和终止信号的 32 位。那将是为 int 编写自己的编组。但是如何将 Dictionary> 传递给 C 代码?
  • 当您说“通过网络”时,您会想到字节序。
  • true 让我们忽略 big/little Endian 或任何其他变体。
  • 这是一个有点奇怪的问题。这就像是在问“为什么我们需要一个邮政系统,而我们可以简单地拥有一个系统,让邮递员提取信件,将其带到中心位置进行分拣,然后将其交付给收件人?”但是……那是邮政系统。你问为什么我们需要一个编组系统,而实际上我们可以拥有……一个编组系统。我想我错过了你问题的重点。你能澄清一下吗?
  • 我认为理解这一点最好的方法是理解“方法”在汇编中是如何工作的——最后一条指令地址是如何保存在堆栈上的,参数是如何通过堆栈传递的,堆栈指针寄存器是通过该方法修改后,使用了指令指针寄存器,特别是在实现方法的不同技术中如何可能存在细微差异。实际上,理解“电线”应该可以对您的问题有所了解。

标签: c# .net unmanaged marshalling managed


【解决方案1】:

因为不同的语言和环境有不同的调用约定、不同的布局约定、不同大小的基元(参见 C# 中的 char 和 C 中的 char)、不同的对象创建/销毁约定以及不同的设计指南。您需要一种方法将这些东西从管理的土地中取出,放到非管理的土地可以看到和理解的地方,反之亦然。这就是编组的目的。

【讨论】:

    【解决方案2】:

    .NET 代码(C#,VB)被称为“托管”,因为它由 CLR(Common Language Runtime)“托管”

    如果您使用 C 或 C++ 或汇编程序编写代码,则它们都被称为“非托管”,因为不涉及 CLR。您负责所有内存分配/取消分配。

    Marshaling是托管代码和非托管代码之间的过程;它是 CLR 提供的最重要的服务之一。

    【讨论】:

      【解决方案3】:

      编组int 理想情况下正是您所说的:将内存从CLR 的托管堆栈复制到C 代码可以看到的某个地方。编组字符串、对象、数组和其他类型是困难的事情。

      但是 P/Invoke 互操作层会为您处理几乎所有这些事情。

      【讨论】:

      • Marshalling 真的在做复制操作吗?我正在研究实时图像处理操作,并且希望不必复制内存中的所有内容。
      【解决方案4】:

      正如 Vinko 在 cmets 中所说,您可以传递原始类型而无需任何特殊编组。这些被称为“blittable”类型,包括 byte、short、int、long 等类型及其无符号对应类型。

      此页面包含blittable and non-blittable types 的列表。

      【讨论】:

        【解决方案5】:

        编组是需要更好的词或网关的“媒介”,通过使用 pinvoke 与非托管世界的数据类型进行通信,反之亦然,并确保数据以安全的方式返回。

        【讨论】:

          【解决方案6】:

          编组是将函数的签名传递给不同机器上的不同进程,通常通过将结构化数据转换为专用格式来实现,该格式可以传输到其他处理器系统(序列化/反序列化)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-02-24
            • 2011-08-19
            • 2017-08-24
            • 2023-03-04
            • 1970-01-01
            相关资源
            最近更新 更多