问题标签 [marshalling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
18441 浏览

c# - 如何将 IntPtr 转换回对象

所有,这是对上一个问题的跟进:C#formatting external Dll function parameters

这里特别是我试图转换为 C# 的代码:

函数“FILES_GetMemoryMapping”被调用了两次,我猜第一次是获取结构的大小,第二次是实际填充它。

“pMapping”是指向 C++ 中结构的指针,在我的 C# 代码中,我将 pMapping 作为 IntPtr 类型。下一行我可以转换为:

以 (UM0516.Mapping) 为结构。很酷,所以我刚刚分配了一些 IntPtr 指向的空间。现在是下一行...“pMapping->NbSectors = 0;”

我应该如何进入现在分配的非托管内存空间,将其类型转换为 (UM0516.Mapping) 结构,并设置其成员之一?然后确保我没有搞砸太多,这样我第二次调用“FILES_GetMemoryMapping”时,它现在可以使用这个结构了吗?

-- 好的,我接受了一些建议,现在有了这个:

我试过了,在第一次“FILES_GetMemoryMapping”调用时出现“AccessViolationException 未处理”异常

这是我所拥有的:

你认为这个异常来自“pMapping”参数吗?这可能来自我传递的其他任何东西吗?

0 投票
1 回答
9497 浏览

c# - 如何在 C# 中编组结构数组?

我在 C# 中有以下结构:

我还需要将这些结构的数组(固定长度)传递给本机代码,本机代码将一些数据写入这些结构。该数组在 C# 中分配并传递给 C dll。我将导入的函数声明为:

但我没有得到任何数据。我已经尝试过 PInvoke 互操作助手。我应该在这里使用 IntPtr 吗?有任何想法吗?

编辑:

这是调用本机函数的 C# 代码:

这是C函数:

0 投票
3 回答
2412 浏览

c# - P/Invoke 帮助期间的 AccessViolationException

从外部 DLL 调用以下内容时,我不断收到 AccessViolationException:

其中有一个我这样设置的原型:

现在,导致这种情况的参数很可能是第 5 个参数(IntPtr pMapping)。我已将此代码从 C++ 应用程序移植到 C#。上面的第 5 个参数是一个指向一个结构的指针,它还包含一个指向另一个结构的指针。以下是我如何设置这些结构:

这些的 C++ 等价物如下:

我觉得我在移植这些结构或移植函数原型时做错了。某种编组问题。

这篇文章顶部的函数在我的代码中被调用了两次。一旦 pMapping 设置为 null(这会将一个值放入“大小”中)。然后使用此大小参数为新结构分配内存,并且现在使用指向此分配内存空间的指针再次调用该函数以进行 pMapping。(pMapping 还有一个指向另一个结构的指针,该结构在此期间也分配了一些空间)。

这是完成此操作的旧 c++ 代码:

我最初认为我没有分配正确的空间量,所以我尝试了上面的旧 C++ 代码并发现:

我在我的 C# 代码中进行了相同的检查,发现以下内容:

我们这里有问题。Mapping 结构的大小应该是 272,但它只有 16。我想我可以做一个快速修复,我在这里手动分配了 272 而不是 16,但它仍然出错,并出现 AccessViolationException。

关于如何解决这个问题的任何想法?或者还有什么问题?

0 投票
2 回答
3751 浏览

memory - 有人可以解释 Marshal.StructureToPtr

我在使用这段代码时遇到了一些问题:

这是我感到困惑的地方:我将逐步执行代码,在我调用最后一个函数(它应该更改 pElement 指向的内存中的一些位)之后,我看到 oElement 发生了变化!?我认为 Marshal.StructureToPtr 将数据从托管结构“复制”到内存。那么这两个位置实际上是一样的吗?托管结构oElement和pElement指向的分配内存?

0 投票
2 回答
8342 浏览

c# - 将 C++ .exe 项目转换为 dll

Microsoft 提供了 vshadow 的源代码来操作 VSS(卷影服务 [shadow copy]),我已经对其进行了一些修改,但我想将它制作成一个 dll,以便我可以在我的 C# 项目中使用它。我不知道该怎么做,源代码相当简单,应该不会太难,但我真的不知道从哪里开始。我应该如何将其转换为可用的 dll 而不是编译为可执行文件?

更新:有人已经这样做了:http ://www.alphaleonis.com/2008/08/alphavss-bringing-windows-shadow-copy-service-vss-to-net/

0 投票
13 回答
135507 浏览

serialization - 序列化和封送处理有什么区别?

我知道就几种分布式技术(例如 RPC)而言,使用了“编组”一词,但不明白它与序列化有何不同。它们不是都将对象转换为一系列位吗?

有关的:

什么是序列化?

什么是对象编组?

0 投票
2 回答
771 浏览

c# - 将引用类型从 C++ 编组到 C#

我想从 C# 调用以下 C++ 函数(由 DLL 导出):

我找到了将原语从 C++ 编组到 C# 的文档,但我不确定如何处理引用类型或非原始类型,例如 VmLoader 或 OptionList(它们都是类)。我正在尝试用 C# 层包装 C++ API,将实际方法实现委托给底层 C++ 代码。

有任何想法吗?

0 投票
1 回答
6833 浏览

c# - 将 std::string 从 C++ DLL 返回到 ac# 程序 -> 指定给 RtlFreeHeap 的地址无效

在我的 C++ DLL 中的一个函数中,我将一个 std::string 返回到我的 c# 应用程序。它看起来像这样:

但是当我的 C# 代码调用此函数时,我在输出窗口中收到此消息:

c# 中的函数声明如下所示:

根据我在网上找到的信息,有时当与删除一起使用的新版本(调试或发布等)之间存在不一致时,会出现此消息。但我不确定这是否是我的情况。所以我不确定是什么原因造成的。也许 MashallAs 可能与此有关?

有任何想法吗?

谢谢!

0 投票
4 回答
3126 浏览

c# - 将 C dll 代码编组为 C#

我在 dll 中有以下 C 代码签名:

C 函数可以修改 w、h、enc、lp、mp 和 ep(尽管后三个可以为 null,它不会做任何事情。

我在 C# 中使用以下内容

我收到了 SystemAccessViolation,但我不完全确定我的问题是什么时候出现的。

0 投票
3 回答
327 浏览

casting - 编组和铸造。它们有关系吗?

上周一个年轻的学生问我编组和选角是否一样。我的回答肯定是不。编组是序列化,将对象的内存表示转换为字节以便传输到网络的方法,而强制转换与类型转换/强制有关。

后来,重新思考这个问题,我认为编组可以看作是铸造的一种特殊情况。例如,内存表示的转换是在 xml 中,那么可以说您正在“转换”为该 xml 文件的相应 xsd 语法定义的类型。

你怎么看待这件事?