从结构句柄的 System::String^ 成员编组到 std::string

2023-12-25

我正在尝试从 System::String^ 编组到 std::string。

通常这可以通过marshal_as<T>模板即

System::String ^managedString = "test";
std::string stdString = marshal_as<std::string>(managedString);

但是如果 String^ 是通过引用访问的结构的一部分,即

value struct SomeStruct {
    String ^managedString;
};

auto structHandle = gcnew SomeStruct();
structHandle->managedString = "test";
std::string stdString = marshal_as<std::string>(structHandle->managedString);

编译器会抛出以下错误

错误 C2665:'msclr::interop::marshal_as':3 个重载都没有 可以转换所有参数类型

但是,如果该结构不是句柄,而是实际的结构,则它可以正常工作。


   auto structHandle = gcnew SomeStruct();

这就是问题开始的地方。这结构体句柄参考点boxedSomeStruct 的副本。它需要装箱,因为 SomeStruct 是一个值类型,该结构的副本存储在 GC 堆上。

您尝试使用的 marshal_as 重载的签名是:

   marshal_as<std::string,System::String^>(System::String ^const &)

The const&问题是,您无法获得对该成员的非托管引用,其地址不稳定(不是 const),因为垃圾收集器可以在执行 marshal_as 时移动该对象。当 marshal_as 现在取消引用不再存在的对象时,这将导致灾难。

解决方法是在尝试转换之前将引用从装箱对象中复制出来:

   structHandle->managedString = "test";
   String^ refCopy = structHandle->managedString;
   std::string stdString = marshal_as<std::string>(refCopy);   // fine

但这只是针对代码中真正问题的一种破解。值类型的存在是为了提高代码效率,允许将结构存储在堆栈帧或 CPU 寄存器上。就像本机 C++ 对象一样。通过对结构进行装箱,您将放弃这一优势。或者换句话说,宣布一个没有任何意义value struct如果您不打算将其视为一种价值。正确使用它来进行正确的修复:

    SomeStruct value;
    value.managedString = "test";
    auto result = marshal_as<std::string>(value.managedString);  // fine

或者,如果您通过在函数参数上错误地使用 ^ 获得引用,则重写为:

    void SomeFunction(SomeStruct% arg) {
        auto nativeString = marshal_as<std::string>(arg.managedString);
        '' etc..
    }

请注意使用 % 而不是 ^ 通过引用传递变量。但不要这样做,值类型的要点是复制值比取消引用指针来获取值更便宜。确保您的值类型不要太大,字段不应超过 4 个。如果它更大,那么您应该使用引用类型。

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

从结构句柄的 System::String^ 成员编组到 std::string 的相关文章

  • 如何将 Activator.CreateInstance 与字符串一起使用?

    在我的反射代码中 我的通用代码部分遇到了问题 特别是当我使用字符串时 var oVal object Test var oType oVal GetType var sz Activator CreateInstance oType oVa
  • 在一个数据库请求中连接 IQueryable 集合

    我使用实体框架 我需要连接两个集合 例如 IQueryable
  • MVVM ViewModel 很多属性

    我是 MVVM 新手 正在开发一个应用程序 我有一个包含很多属性的表单视图 大约 50 个 我不能将它们分离到用户控件中 因为这会破坏 mvvm 原则 我无法将它们分成模型 因为它们包含逻辑 属性更改 错误更改这些都不是 poco 类 并且
  • .NET Core 3 是否支持 TLS 1.3

    我正在使用 NET Core 3 0 制作仅支持 TLS 1 3 的代理 我看到 SslProtocols 中定义了 Tls13 12288 但在我的测试过程中 它只抛出异常 客户端和服务器无法通信 因为它们不具备通用算法 所以我的问题是
  • 在VB.net中动态添加用户控件

    我在 Vb net Windows 应用程序 中制作了自定义 UserControl 如何将其动态添加到表单中 UserControl 本质上只是另一个类 它继承自 Control 因此您可以使用控件执行各种操作 但除此之外它只是一个类 因
  • 使用 LINQ 迭代类属性

    有一个 ParsedTemplate 类 它有超过 300 个属性 类型为 Details 和 BlockDetails parsedTemplate 对象将由函数填充 填充这个对象后 我需要一个 LINQ 或其他方式 来查找是否有任何属性
  • MVVM Light Toolkit 抛出 System.IO.FileLoadException

    我正在运行 VS 2010 和 Expression Blend 4 beta 我从提供的模板创建了一个 MVVM Light 项目 当我尝试在 VS 2010 设计器窗口中查看 MainWindow Xaml 时 出现 System IO
  • 替换字符串中的换行符 C#

    如何在 C 中替换字符串中的换行符 使用替换为Environment NewLine myString myString Replace System Environment NewLine replacement text add a l
  • 当 C# 位于同一包含类中时,为什么以及如何允许访问类本身之外的私有变量?

    我不知道这个问题是否具有足够的描述性 但是这种行为为什么以及如何存在 public class Layer public string Name get set private IEnumerable children public IEn
  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 检测笔记本电脑盖子的关闭和打开

    是否可以检测笔记本电脑的盖子何时打开或关闭 从我读到的内容来看 这是不可能的 但 SO 之前已经帮助我完成了不可能的任务 我发现唯一可能朝着正确方向的事情是关于报告电源按钮所需的 IOCTL 的 MSDN 博客文章 https learn
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • ASP.NET 3.5 更新至 4.0 -> Sys.WebForms.PageRequestManager 未定义

    正如标题所示 我最近将包含 UpdatePanels 和类似 AJAX 技术的 ASP NET 3 5 应用程序更新为 ASP NET 4 0 不幸的是 UpdatePanel 不再起作用 整页回发使一切都变得糟糕 Web config 文
  • 用户如何在winforms运行时调整控件大小

    假设我有一个图片框 现在我想要的是用户应该能够随意调整图片框的大小 但是我不知道如何开始做这件事 我搜索过互联网 但信息很少 有人至少可以指导我从哪里开始吗 这很容易做到 Windows 中的每个窗口都具有与生俱来的可调整大小的能力 它刚刚
  • 为什么 Java 和 .NET 中的字符串不能是可变的?

    为什么他们决定制作String在 Java 和 NET 以及其他一些语言 中是不可变的 他们为什么不让它可变呢 根据有效的Java http www oracle com technetwork java effectivejava 136
  • 公共领域还好吗?

    在你像我最初那样做出直觉反应之前 请阅读整个问题 我知道它们让你感觉很脏 我知道我们以前都被烧伤过 我知道这不是 好风格 但是公共场所可以吗 我正在开发一个相当大规模的工程应用程序 该应用程序创建并使用结构的内存模型 从高层建筑到桥梁再到棚
  • 从嵌套 ToolStripMenuItem 检索时,ContextMenuStrip.Owner 属性为 null

    我有一个ContextMenuStrip设置有两个ToolStripItem是 第二ToolStripItem有两个额外的嵌套ToolStripItems 我将其定义为 ContextMenuStrip cms new ContextMen
  • 在 foreach 循环中更改另一个结构内的结构

    打印以下代码 调用 MyMethod 时 0 0 0 1 我希望它打印 0 0 1 1 为什么是这样 Code private struct MyStruct public MyInnerStruct innerStruct private
  • 将 KeyDown 事件传递给其他控件

    我正在编写一个 C WinForms 应用程序 NET 4 0 我有一个WinFormsControl on a Form 用户开始使用键盘输入内容后 另一个Control出现 那Control是某种文本输入 我想将用户输入发送到该Cont
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c

随机推荐

  • Gradle构建找不到方法

    我正在跟踪开始 Android 开发 https app pluralsight com library courses android start developingPluralsight 课程 我们即将添加测试 说明说要添加添加and
  • 如何使用 JSF/Primefaces 使两个字段中的一个至少为必填字段

    我将 primefaces 与 jsf 一起使用 并且我想至少将两个字段之一设置为必填字段 这意味着如果这两个字段同时为空 将显示错误消息 这是我的代码示例
  • SSIS - RPC 服务器不可用

    我已安装 SQL Server 实例 并在安装向导中选择 Integration Services 但是 当我以 管理员 身份运行 SQL Server Management Studio 时 我可以在下面看到我的实例 数据库引擎 分析服务
  • 将映像包含在可执行 jar 中

    我一整天都在浏览 Stackoverflow 寻找如何做到这一点 但还没有成功 我正在将我制作的快速游戏打包成可执行 jar 但我没有正确引用图像 我只是引用了文件 background ImageIO read new File wood
  • 将 json 对象存储到 Azure blob 存储

    有没有办法存储 json 对象而不将其转换为流 我可以将其转换为流后上传 但是是否有任何方法可以将对象存储为 something json 而不将其转换为流 我现在应该做什么 const azureStorage require azure
  • OOP在大学里被滥用了吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我两年前开始上大学 从那时起我一直听到 首先设计你的课程 有时我真的会问自己 我的解决方案首先应该是一堆对象吗 有人说你看不到它的好处 因为你的
  • 显示 Android 中按下按钮后经过的时间

    我希望能够在 统计 类中的文本视图或计时器中显示自按下另一个类中的按钮以来经过的时间 实现这个最简单的方法是什么 Thanks 设置变量怎么样 System currentTimeMillis 当你膨胀视图时 在 onDestroy 处从当
  • 更改 LazyRow 上的滚动速度

    查看文档LazyRow我想知道是否可以降低滚动速度 看起来像LazyRow继承自ScrollState但我找不到任何关于如何降低滚动速度的有用信息 LazyRow 没有用于自定义滚动速度的参数 因此您必须手动执行此操作 您可以首先捕获类似于
  • Apollo GraphQL - 将 .graphql 架构导入为 typeDefs

    使用 graphql yoga 您可以通过执行以下操作简单地导入模式 typeDefs src schema graphql apollo server express 是否有类似的方法 如果没有 如何从外部导入 typeDefs grap
  • Android XML:RuntimeException:无法解析索引 6 处的属性

    你好亲爱的stackoverflower 在我的项目中 我使用新的 android 设计库 问题是 有一个运行时异常 我正在尝试创建一个浮动按钮 java lang RuntimeException Failed to resolve at
  • 将一个堆栈推入另一个堆栈

    在 C 中 有没有一种方法可以将一个堆栈压入另一个堆栈 而无需迭代堆栈元素 如果没有 我应该使用更好的数据结构吗 在Java中你可以这样做 stack1 addAll stack2 我希望找到 C 的类似物 0 安全解决方案 扩展方法 pu
  • 替换()与“[<-”?

    我最近偶然发现replace and lt 它们似乎具有相似的功能 例如 lt 我可以做这样的事情 gt x tst lt array 1 6 c 2 3 gt s tst lt array 0 c 2 3 gt s tst 1 2 3 1
  • 无法通过 MavenCli (maven-embedder) 运行 Maven 任务

    我在程序中使用 Maven embedder 3 3 3 以编程方式运行 Maven 目标 每次运行时都会出现以下错误MavenCli doMain method Dmaven multiModuleProjectDirectory系统属性
  • 通过 OKTA SAML 单点注销

    我收到以下 SP 请求和 IDP 响应
  • android css 背景图像未找到

    我正在尝试使用图像纹理作为我的网页主体背景 我的网页显示在 Android 网络视图中 这是我的CSS body font family helvetica font size 12px color 555555 padding 10px
  • Ansible 正则表达式匹配字符串并提取行

    我试图在一行中的 1 个空格之后找到一个字符串 如果存在 则提取完整的行并存储在不同的变量中 我正在使用 ansible 和正则表达式 如果该字符串存在于任何其他位置 则不应匹配它 我尝试使用 regex match 和 select 但出
  • Spring授权和资源在同一台服务器上

    我是 spring 环境的新手 我刚刚学习 oauth2 有没有办法让授权服务器也成为资源服务器 我正在看这个新项目https github com spring projects spring authorization server h
  • 模拟 ViewContext 来测试验证错误消息

    故事是这样的 为了能够将格式良好的 Bootstrap 控件放入我的 MVC 表单中 我正在构建一个HtmlHelper扩展方法 使用单个命令生成以下结构 div class control group Html LabelFor m gt
  • MSI 安装程序失败且未删除以前的安装

    我已经构建了一个我想要部署并经常更新的 MSI 不幸的是 当您安装 MSI 然后尝试安装同一 MSI 的较新版本时 它会失败 并显示类似 已安装此产品的另一个版本 此版本的安装无法继续 的消息 MSI 是使用 Visual Studio 2
  • 从结构句柄的 System::String^ 成员编组到 std::string

    我正在尝试从 System String 编组到 std string 通常这可以通过marshal as