问题标签 [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 投票
3 回答
3909 浏览

c# - 我什么时候应该明确指定一个 StructLayout?

我正在摆弄从 C# 调用 DLL,并且遇到了定义我自己的结构的需要。许多文章强制结构的顺序布局

因此,我遵循套件,并且我的程序有效。现在,当我把线拿出来时,它仍然有效。为什么我需要它?

0 投票
3 回答
2432 浏览

.net - .NET 编组速度

我有一个 C++ 方法签名,如下所示:

我已经将该函数包装在内部和外部的计时方法中。在内部,该函数以 0.24s 运行。在外部,该函数运行时间为 2.8 秒,或慢了大约 12 倍。这是怎么回事?编组让我慢了这么多吗?如果是,我该如何解决?我应该去不安全的代码并使用指针还是什么?我对额外的时间成本从何而来感到困惑。

0 投票
3 回答
648 浏览

c# - 有没有办法从 C# 应用程序调用非托管(非 COM)dll?

有没有办法在我的 C# 应用程序中使用(引用)用非托管 C++(不是 COM 库)编写的 DLL?

当我尝试从 Visual Studio 中引用它时,我收到“不是 COM 对象”错误消息。

也许有某种翻译器\路由器可以 COMify 我的 DLL 参考?我不知道 COM 和 COM 互操作是如何工作的,因为我在这对我来说已经没有必要的时候就开始编程了。

谢谢你。

0 投票
2 回答
5278 浏览

c# - 我是否需要在非托管代码中删除通过 Marshal.PtrToStructure 封送的结构?

我有这个 C++ 代码:

然后在 C# 中我这样调用函数:

其中 MyDataStructure 是一个结构(不是类),它对应于 MY_DATA_STRUCTURE 并且成员被适当地编组。

所以问题:当 MyDataStructure 被 GC 时,我是否需要存储 pData 然后在非托管代码中再次释放它?MSDN 对 Marshal.PtrToStructure(IntPtr, Type) 说:“将数据从非托管内存块编组到新分配的指定类型的托管对象。” 在那句话中,“Marshall”是指“复制”吗?在这种情况下,我需要保留 (IntPtr pData),然后将其传递给非托管代码(在 MyDataStructure 析构函数中),以便我可以执行 C++“删除”?

我已经搜索过,但找不到足够明确的答案。

0 投票
4 回答
1327 浏览

c# - 非托管/托管互操作 - 传递 int[] 时遇到问题

我正在攻读化学博士学位,因此我需要编写一个软件应用程序来帮助我在显微镜下对样品进行成像。该显微镜配有 xyz 纳米定位台。该阶段由硬件供应商使用 VC++ 编写的非托管 DLL 控制。我可以为您提供更多需要的细节,但让我从这个开始;

dll 中的一种方法允许我读取运动轴的设置:

C++ 语法:

根据惯例,BOOL 是 int 0 或 1。

我的 C# 包装器包含:

这对我来说似乎是正确的。但是,当我在我的主应用程序中尝试这样的事情时(查询轴 1,2 和 3):

我一直得到这样的数组:

{6, 0, 10} 而根据设备本身的显示我应该得到 {0, 0 , 0} 。互补功能:

BOOL E7XX_SVO (int ID, const char* szAxes, const BOOL* pbValueArray)在舞台上设置相同的状态位也不起作用......

dll 中的其他命令运行良好。我可以毫无问题地传入和传出字符串和双打,但不是 BOOL 类型......

你们知道可能出了什么问题吗?

0 投票
1 回答
3587 浏览

c# - 如何在 C# 中编组打包结构的非托管缓冲区

我(成功)使用以下 pinvoke 签名在 c# 中调用 Windows FilterSendMessage 函数:

outBuffer参数填充了任意数量的结构(一个接一个地打包),在 C 中定义为:

名称字段被分配了一个可变长度、以空字符结尾的 unicode 字符串。len字段以字节为单位描述结构的总大小(包括名称字符串)。我相信在非托管方面如何处理结构没有任何问题。

当我尝试将 outBuffer 编组到 C# 中定义为 BAH_RECORD 结构的实例时,我的问题出现了:

如果我尝试打印/查看/显示 bah.name,我会得到垃圾......

为了确认 outBuffer 确实包含有效数据,我在 c# 中做了一些粗略的指针骇客来逐步处理它,调用 Marshal.ReadInt32 两次(以覆盖前 2 个结构字段),然后调用 Marshal.ReadByte 几次以填充一个字节[] 然后我将其用作 Encoding.Unicode.GetString() 的参数......字符串出来很好,所以它肯定在那里,我似乎无法让编组器正确处理它(如果它甚至能够?)

任何帮助表示赞赏

史蒂夫

0 投票
3 回答
4723 浏览

c++ - 如何将接口指针传递给线程?

笔记:

  • 使用原始 Win32 CreateTheard() API
  • 没有 MFC
  • 接口只是一个指向 vtable 的指针

问题:

  • 如何将接口指针传递给线程?

插图:

问候

0 投票
3 回答
995 浏览

c# - C++ CLI 神秘的函数调用

所以我试图调用一个函数,它是一个围绕 OCX 对象的管理包装器。有很大的困难。功能是;

其中 'theBuffer' 是一个字节数组。'foo' 包装的非托管 OCX 的模板是

所以我试过了;

失败了。和

它可以编译,但显然被调用的函数不会为我创建 .NET 位图。

所以我想问题是我如何将这个函数传递给它可以写入的内存块,然后在.NET世界中访问它。

谢谢

0 投票
1 回答
1251 浏览

c# - 从非托管 unicode 字符串创建 SecureString

我想尝试以最好的方式将 CryptUnprotectData windows API 函数和 .net SecureString 联系在一起。CryptUnprotectData 返回一个由字节数组和字节长度组成的 DATA_BLOB 结构。在我的程序中,这将是一个 Unicode UTF-16 字符串。SecureString 有一个构造函数,它接受一个 char* 和长度参数,所以我希望能够执行以下操作:

这行得通,除了 UTF-16 是可变长度的,所以我真的不知道用什么作为长度参数。上面的示例假设 2 字节字符 (BMP),但对于其他平面,它可能最多为 4 字节。我需要知道字节数组中 UTF-16 字符的数量。在不复制内存中的值(从而损害安全性)的情况下,最好的方法是什么。我计划尽快清零并释放字节数组。

0 投票
4 回答
86192 浏览

c++ - 如何在 C++ 中序列化对象?

我有一个小的对象层次结构,我需要通过套接字连接对其进行序列化和传输。我需要序列化对象,然后根据它的类型反序列化它。有没有一种简单的方法可以在 C++ 中做到这一点(就像在 Java 中一样)?

有没有 C++ 序列化在线代码示例或教程?

编辑:为了清楚起见,我正在寻找将对象转换为字节数组,然后再转换回对象的方法。我可以处理套接字传输。