2014-01-30 33 views
-1

自從.NET以前我沒有用C++編寫程序 - 對於Windows我現在使用C#和.Net。在C++應用程序中調用C#DLL會導致此錯誤的原因是什麼?

我有一個C#.Net DLL,我從其他C#程序調用沒有問題。但我有一個客戶想從C++中調用它,所以我正在編寫一個練習應用程序,以瞭解它是如何完成的。 N.B.這是C++/CLI,即它是一個託管CLI-CIL-CLR應用程序。

在我的C#程序中,我添加了我的DLL作爲參考,然後在我的代碼中我有一個使用語句,然後實例化它。 。 。

using ScannerBeam; 
    . . . 

    CScannerBeam SB = new CScannerBeam(); 

。 。 。作品一種享受,沒有問題。但在C++中,我還添加了DLL作爲參考,並執行一個

using namespace ScannerBeam; 
    . . . 

    CScannerBeam SB = gcnew CScannerBeam(); 

...我得到一個錯誤。 。 。

錯誤1錯誤C3673:「ScannerBeam :: CScannerBeam」:類沒有一個拷貝構造

爲什麼它需要一個拷貝構造函數時,C#不?它需要一個深層副本還是隻是一個淺層?我需要知道從(託管/ CLI/CLR)C++調用C#DLL的其他問題?

+3

我想你需要'CScannerBeam ^'。 – SLaks

+0

歡迎來到C++,其中對象有一個內容 - 在C++/cli中,您必須處理託管指針T ^(指針T *,引用T&和簡單值T) –

+0

@DieterLücking:'T ^'是一個「追蹤句柄」。不要忘記追蹤參考'T%'。 ''interior_ptr '。 –

回答

1

參考類需要refptrs,CScannerBeam ^表示C++ - CLI中的ref_ptr。

+0

並非如此。 'CScannerBeam SB;'是有效的(堆棧語義),但是你不會使用'gcnew'來初始化它。 –

1

gcnew計算結果爲追蹤手柄,類型CScannerBeam^

你的代碼是不是從很大的不同:

std::string s = new std::string(); 

這也是錯誤的,右邊是一個指針和左側ISN 「T。

就像本地C++,使用

CScannerBeam SB; // creates an object with stack semantics 
       // it will be disposed at end the of the scope 
func(sb.member); 

CScannerBeam^ pSB = gcnew ScannerBeam(); // get handle to object on managed heap 
             // it has dynamic lifetime and will live as 
             // long as the .NET garbage collector can reach it 
func(pSB->member); 
相關問題