Я новичок в C++/CLI, и мне приходится сталкиваться с некоторыми проблемами при запуске моего приложения. У меня есть сценарий, когда неуправляемый код нужно вызвать управляемый код. Для этого я использую GCHandle. Вот как мой класс CLI выглядитошибка C++/CLI в GChandle
#pragma once
#include <msclr\gcroot.h>
#include "UnmanagedClass1.h"
using namespace System;
namespace Wrapper {
public ref class WrapperClass
{
private:
UnmanagedClass::UnmanagedClass1* UnmanagedClass1obj;
GCHandle delegateHandle_;
public:
WrapperClass(void);
delegate void EventDelegate(char *);
EventDelegate^ nativeCallback_;
void callback(char *msg);
};
}
и файл CPP
using namespace Wrapper;
WrapperClass::WrapperClass(void)
{
UnmanagedClass1obj = new UnmanagedClass::UnmanagedClass1();
nativeCallback_ = gcnew EventDelegate(this, &WrapperClass::callback);
// As long as this handle is alive, the GC will not move or collect the delegate
// This is important, because moving or collecting invalidate the pointer
// that is passed to the native function below
delegateHandle_ = GCHandle::Alloc(nativeCallback_);
// This line will actually get the pointer that can be passed to
// native code
IntPtr ptr = Marshal::GetFunctionPointerForDelegate(nativeCallback_);
// Convert the pointer to the type required by the native code
UnmanagedClass1obj ->RegisterCallback(static_cast<EventCallback>(ptr.ToPointer()));
}
void WrapperClass::callback(char *msg)
{
//TDO
}
я получаю следующие ошибки
error C2146: syntax error : missing ';' before identifier 'delegateHandle_'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support
error C2065: 'delegateHandle_' : undeclared identifier
error C2653: 'GCHandle' : is not a class or namespace name
error C3861: 'Alloc': identifier not found
error C2653: 'Marshal' : is not a class or namespace name
error C3861: 'GetFunctionPointerForDelegate': identifier not found
Top 3 ошибки находятся в файле .h и отдыха в CPP file Я пропустил какую-нибудь библиотеку?
У меня есть несколько вопросов, касающихся осуществления:
Выход проекта будет длл. Затем, как я использую его для реализации обратного вызова с кодом C#. Я имею в виду, нужно ли передавать объект класса C# в качестве ссылки (как?) Или каким-либо другим способом?
Я использую указатель символа, чтобы перейти на C#. Есть ли лучший тип данных? Например, BSTR? Кто выпустит память C#, CLI, C++?
GCHandle and Marshal находятся в пространстве имен System :: Runtime :: InteropServices. Просто добавьте директиву * using * в начало файла исходного кода. –
Спасибо, все ошибки исчезли ... поставьте его как ans. А также, PLZ помочь с оставшейся частью вопроса. – user2692032