C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'

Posted

技术标签:

【中文标题】C++ 和 .NET - 从 \'System::String ^\' 转换为 \'_variant_t\'【英文标题】:C++ and .NET - Converting from 'System::String ^' to '_variant_t'C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t' 【发布时间】:2014-01-07 01:22:11 【问题描述】:

我正在开发一个托管 C++ 应用程序,该应用程序利用 C# 库来填充 ADO 记录集中的字段:

recordset->Fields->GetItem(L"Id")->Value = _variant_t(Library::IdGenerator->GenerateNewId());

但是,在将库返回的 .NET 字符串转换为 _variant_t 之前,我在将其添加到记录集之前遇到了错误。

这是我得到的错误:

error C2440: '<function-style-cast>' : cannot convert from 'System::String ^' to '_variant_t'

我是否错过了转换或强制转换以使其正常工作?

【问题讨论】:

【参考方案1】:

是的,需要转换。 _variant_t 类不是一个非常愉快的匹配,由于一个深不可测的原因,它缺少一个采用 BSTR 的构造函数,采用 _bstr_t 的构造函数没有吸引力,因为它复制了字符串。回退到原生 VARIANT 类型,如下所示:

using namespace System::Runtime::InteropServices;
...
    String^ s = Library::IdGenerator->GenerateNewId();
    VARIANT v =  VT_BSTR ;
    v.bstrVal = (BSTR)Marshal::StringToBSTR(s).ToPointer();
    recordset->Fields->GetItem(L"Id")->Value = v;

【讨论】:

工作就像一个魅力!非常感谢:)

以上是关于C++ 和 .NET - 从 'System::String ^' 转换为 '_variant_t'的主要内容,如果未能解决你的问题,请参考以下文章

无法从 C++ 调用 .Net 服务

将结构数组从 C#(.NET Core) 传递到 C++(未管理)

从 .NET 应用程序调试 C++ 代码时出现问题

从三个语言(C++,Java,.Net)的几个性能测试案例来看性能优化

调试从非托管 C++ 调用的托管 .NET 代码

一个从C++初级到C#高级的面试历程