我正在创建一个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();
我得到:“指针和固定大小的缓冲区只能在不安全的上下文中使用”
我想通过做新的我正在创建一个托管字符串
答案 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
我相信^表示托管指针。