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

c# - 从字节数组中读取 C# 中的 C/C++ 数据结构

从数据来自 C/C++ 结构的 byte[] 数组填充 C# 结构的最佳方法是什么?C 结构看起来像这样(我的 C 非常生锈):

并会填充这样的内容:

如果作为 byte[] 数组传递,则复制OldStuff到的最佳方法是什么?NewStuffOldStuff

我目前正在做类似以下的事情,但感觉有点笨拙。

有没有更好的方法来做到这一点?


使用BinaryReader该类是否会比固定内存和使用提供任何性能提升Marshal.PtrStructure

0 投票
2 回答
12163 浏览

.net - 如何编组结构数组 - (.Net/C# => C++)

免责声明:编组概念接近零。

我有一个结构 B,其中包含一个字符串 + 一个结构 C 数组。我需要将它跨过巨大的互操作鸿沟发送给 COM - C++ 使用者。
我需要哪些正确的属性集来装饰我的结构定义?

编辑:@Andrew 基本上这是我朋友的问题。他让这个东西在 .Net 中工作 - 他做了一些自动创建 .tlb/.tlh 的东西,然后他可以在 C++ 领域中使用。问题是他无法修复数组大小。

0 投票
2 回答
2341 浏览

.net - 从 .NET 向 COM 公开嵌套数组

我在 .NET (C#) 中有一个方法,它返回string[][]. 使用 RegAsm 或 TlbExp(来自 .NET 2.0 SDK)为包含程序集创建 COM 类型库时,我收到以下警告:

警告:嵌套数组不支持封送处理。

此警告导致相关方法未导出到生成的类型库中。有人告诉我,有一些方法可以使用 Variant 作为 COM 返回类型,然后在 COM 客户端进行强制转换/等。对于这个特定的程序集,目标客户群是 VB6。但是在 .NET 端,您实际上是如何做到这一点的呢?

注意:我有一个现有的旧版 DLL(及其导出的类型库),其中返回类型为 Variant,但此 DLL(和 .tlb)是使用 .NET 之前的旧版工具生成的,因此我无法使用它们。

如果程序集是用 VB.NET 编写的,它会有所帮助吗?

0 投票
2 回答
6897 浏览

.net - 在 C++/CLI 中将 std::vector<>::iterator 转换为 .NET 接口

我正在包装一个本机 C++ 类,它具有以下方法:

1) 表示这种接口的“.NET 方式”是什么?返回数组<>的单个方法?array<> 泛型是否有迭代器,以便我可以实现 BeginLocals() 和 EndLocals()?

2) Local 是否应该在 .NET 包装器中声明为值结构?

我真的很想用 .NET 风格来表示包装类,但我对托管世界很陌生——这种类型的信息让谷歌感到沮丧......

0 投票
2 回答
401 浏览

com - 使用 COM 互操作处理对象生命周期的最有效方法是什么?

我有一个 Windows 工作流应用程序,它使用我为 COM 自动化编写的类。我正在使用 COM 从我的课程中打开 Word 和 Excel。

我目前正在我的 COM 助手中实现 IDisposable 并使用 Marshal.ReleaseComObject()。但是,如果我的工作流程失败,则不会调用 Dispose() 方法,并且 Word 或 Excel 句柄保持打开状态并且我的应用程序挂起。

这个问题的解决方案非常简单,但不仅仅是解决它,我想学习一些东西并深入了解使用 COM 的正确方法。我正在寻找“最佳”或最有效和最安全的方式来处理拥有 COM 句柄的类的生命周期。模式、最佳实践或示例代码会有所帮助。

0 投票
10 回答
30655 浏览

marshalling - 什么是对象编组?

我经常听到这个概念,但我并没有很好地理解它是什么。

0 投票
3 回答
5505 浏览

.net - C# P/Invoke 中的 Marshal C++“字符串”类

我在本机 DLL 中有一个函数,定义如下:

我试图把它放在微软的 P/Invoke Interop Assistant 中,但它在“字符串”类(我认为它来自 MFC?)上窒息。

我尝试将其封送为各种不同的类型(C# String、char[]、byte[]),但每次我得到 NotSupportedException 或 Native Assembly Exception(取决于我尝试的封送处理)。

正如任何人做过使用本机字符串类的本机/托管互操作一样?有什么办法可以对此进行元帅吗?我将不得不编写自己的 Marshaler 吗?

0 投票
3 回答
2806 浏览

.net - 运行时可调用包装器 (RCW) 范围 - 进程或应用程序域?

引用非托管 COM 对象时,运行时可调用包装器 (RCW) 的范围是什么?根据文档:

运行时为每个 COM 对象只创建一个 RCW,无论该对象上存在多少引用。

如果我不得不“猜测”——这个解释应该是“每个进程一个”,但真的是这样吗?任何额外的文档都将非常受欢迎。

我的应用程序在它自己的应用程序域中运行(它是 Outlook 插件),我想知道如果我在循环中使用 Marshal.ReleaseComObject(x) 直到它的计数达到 0(如推荐的那样)会发生什么。它会释放来自其他插件的引用(在同一 Outlook 进程中的其他应用程序域中运行)吗?

编辑:完美 - 现在混乱更大了。基于 2 个答案(来自 Lette 和 Ilya),我们有 2 个不同的答案。官方MSDN 文档说每个进程(对于版本 2.0+),但是对于版本来说它缺少这句话。1.1 的文档

同时,在 Mason Bendixen 的文章中,它说它是 per appdomain。

由于他的文章很旧(2007 年 4 月),我已经给他发了一封电子邮件,要求澄清,但如果其他人必须添加一些东西,请做。

谢谢

0 投票
2 回答
38409 浏览

.net - C# 中的元帅“char *”

给定 DLL 中的以下 C 函数:

您将如何将这个函数 P/Invoke 到 C# 中并正确编组 char *。.NET 似乎知道如何执行 LPCTSTR,但是当我无法弄清楚在调用此函数时不会导致 NotSupportedException 触发的任何封送处理时。

0 投票
5 回答
71073 浏览

c# - 将 C++ 结构数组编组为 C#

我在 C++ 中有以下结构:

以及我正在调用/调用的函数以获取其中 3 个结构的数组:

在 C++ 中,我会做这样的事情:

它会工作得很好,但在 C# 中我似乎无法让它工作。我创建了一个这样的 C# 结构:

如果我初始化其中 3 个数组(以及它们的所有子数组)并将其传递给它:

它返回成功,但 LPRData 数组中的数据没有改变。

我什至尝试创建一个大小为 3 个 LPRData 的原始字节数组,并将其传递给这样的函数原型:

获取数据(字节 [] 数据);

但在这种情况下,我将从第一个 LPRData 结构中获取“数据”字符串,但之后没有任何内容,包括来自同一 LPRData 的“prob”数组。

关于如何正确处理这个问题的任何想法?