2014-01-30 5 views
-1

Я до сих пор не программировал на C++ .Net - для 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# не делает? Нужна ли вам глубокая копия или просто мелкая? Любые другие gotchas мне нужно знать, вызывая C# DLL из (управляемый/CLI/CLR) C++?

+3

Я думаю, что вам нужно '' CScannerBeam ^. – SLaks

+0

Добро пожаловать в C++, где объекты имеют контент - в C++/cli вам нужно иметь дело с управляемыми указателями T^(указатели T *, ссылки T & и простые значения T) –

+0

@ DieterLücking: 'T ^' - это «отслеживающий дескриптор». И не забудьте ссылку отслеживания 'T%'. И 'interior_ptr '. –

ответ

1

Классы Ref нуждаются в refptrs, CScannerBeam^обозначает ref_ptr в C++ - CLI.

+0

Не так много. 'CScannerBeam SB;' действительно (семантика стека), но вы не будете использовать 'gcnew' для его инициализации. –

1

gcnew вычисляет трекинга ручкой, типа CScannerBeam^

Ваш код не сильно отличается от:

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

который также является ошибкой, правая сторона является указателем, а левая сторона ISN «т.

Так же, как родной 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); 
Смежные вопросы