2014-01-23 79 views
0

我創建一個C++/CLI類包裝自動生成的.h文件,以便它的值可以從C#如何從C返回一個託管字符串++/CLI類

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

更正的類名錯誤 – markshancock

回答

3

當我編譯VS 2012的代碼,我得到兩個錯誤:

  • 的類名爲Sample,但C#代碼引用它爲OTRM_Ovd_FPGA
  • error C2750: 'System::String' : cannot use 'new' on the reference type; use 'gcnew' instead

一旦我更正了類名並用gcnew替換了new,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";的方法相同。調用gcnew System::String會導致不必要的字符串副本被構建。

+0

對不起,我試圖簡化我的實際代碼,並錯過了類名更改。 – markshancock

+0

我得到的不是C++部分;但是,C#調用它。我得到了「指針和固定大小的緩衝區只能在不安全的環境中使用」。 gcnew電話對此沒有影響。 – markshancock

+0

C#認爲'GetFilename'和'GetSignature'的簽名是什麼? –

0

的^從你的宣言

刪除
System::String^ 

變爲

System::String 

我相信^手段一個託管指針。

3

嘗試gcnew System::String()代替..

要創建我們應該用gcnew託管類的實例。

相關問題