2013-06-18 64 views
1

我想從c#中使用C++/cli代碼調用非託管函數。如何從C++/cli靜態函數返回託管類

我有類似的代碼如下:

MyFileWrapper MyFileWrapper::ReadMyFile(System::String ^fileName) 
{ 
    auto nativeMyFile=MyFile::ReadMyFile((char *) 
      System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(
      fileName).ToPointer()); 
    MyFileWrapper myFileWrapper=gcnew MyFileWrapper(); 
    // code will be added to read information from native object and convert them to wrapper properties. 
    return myFileWrapper; 

} 

但是我得到錯誤

Error 2 error C2440: 'return' : cannot convert from 'MyFileWrapper' to 'MyFileWrapper' MyFileWrapper.cpp 
Error 1 error C3673: 'MyFileWrapper' : class does not have a copy-constructor MyFileWrapper.cpp 

對於第一個錯誤,智能感知給我下面的錯誤,有更好的解釋:

IntelliSense: no suitable user-defined conversion from "MyFileWrapper ^" to "MyFileWrapper" exists 

什麼問題,我該如何解決?

+0

學習的形式來定義何時使用帽子^是在C++/CLI編程關鍵。一定要讀一本書或遵循一個很好的教程。 –

回答

2

gcnew MyFileWrapper()返回MyFileWrapper^(即,對MyFileWrapper實例的管理參考),而不是MyFileWrapper

MyFileWrapper^ MyFileWrapper::ReadMyFile(System::String^ fileName) 
{ 
    ... 
    MyFileWrapper^ myFileWrapper = gcnew MyFileWrapper(); 
    ... 
    return myFileWrapper; 
} 
1

你的返回類型和臨時變量應該是MyFileWrapper^,他們管理的畢竟。

0

所有C/CLI層的管理類型應該在類型名^

+0

並非所有的託管類型,只有引用類型。 –