如何从C ++ / CLI类返回托管字符串

时间:2014-01-23 01:55:36

标签: c# .net c++-cli

我正在创建一个C ++ / CLI类来打包一个自动生成的.h文件,以便可以从C#中访问它的值

Sample.h包含(自动生成,无法更改)

#define NiFpga_M_OTRM_OVDFPGA_Bitfile "NiFpga_M_OTRM_OVDFPGA.lvbitx"
static const char* const NiFpga_M_OTRM_OVDFPGA_Signature = "D0751ADE3A0EC976606D63C425B35E85";

我创建了一个C ++ / CLI类,如下所示

#include "Sample.h"

using namespace System;
using namespace Platform;
public ref class Sample
{
public:
    static System::String^ GetFilename() { return new System::String(NiFpga_M_OTRM_OVDFPGA_Bitfile);};
    static System::String^ GetSignature() { return new System::String(NiFpga_M_OTRM_OVDFPGA_Signature);};
}

当我尝试从C#中使用它时:

string bitfileName = Sample.GetFilename();
string signature = Sample.GetSignature();

我得到:“指针和固定大小的缓冲区只能在不安全的上下文中使用”

我想通过做新的我正在创建一个托管字符串

3 个答案:

答案 0 :(得分:3)

尝试gcnew System::String()而不是..

要创建托管类的实例,我们应该使用gcnew

答案 1 :(得分:3)

当我在VS 2012中编译代码时,我收到两个错误:

  • 该类名为Sample,但C#代码将其引用为OTRM_Ovd_FPGA
  • error C2750: 'System::String' : cannot use 'new' on the reference type; use 'gcnew' instead

我更正了类名并将new替换为gcnew后,C ++ / CLI和C#代码都运行良好。

我对您的代码有一个建议:

return gcnew System::String(NiFpga_M_OTRM_OVDFPGA_Bitfile);

不需要拨打gcnew System::String。由于NiFpga_M_OTRM_OVDFPGA_Bitfile是#define,因此替换由预处理器完成。 C ++ / CLI编译器知道如何将引用的字符串作为String ^处理,因此您可以执行return NiFpga_M_OTRM_OVDFPGA_Bitfile;,就像在返回return "foo";的方法中String^一样。调用gcnew System::String会导致要构造的字符串的不必要副本。

答案 2 :(得分:0)

从声明中删除^

System::String^

变为

System::String

我相信^表示托管指针。