2013-08-25 2 views
0

Я новичок в 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++?

+1

GCHandle and Marshal находятся в пространстве имен System :: Runtime :: InteropServices. Просто добавьте директиву * using * в начало файла исходного кода. –

+0

Спасибо, все ошибки исчезли ... поставьте его как ans. А также, PLZ помочь с оставшейся частью вопроса. – user2692032

ответ

0

Я думаю, вы только что сделали самую сложную часть обертки. Теперь я создам событие в оболочке для отправки сообщений любому подписчику. Позвольте мне показать вам код: H файл

// Define out custom delegate for event 
public delegate void StringEventHandler(String^ /*msg*/); 

ref class WrapperClass{ 
    // ... rest of class declaration ... 
public: 
    event StringEventHandler^ MyEvent; 
    // ... 
} 

CPP файл

// ... code 
void WrapperClass::callback(char* msg) 
{ 
    // Our method to marshal to String from char* 
    String^ managedString = NativeString2ManagedString(char* msg); 

    // Call the event delegate 
    MyEvent(managedString); 
} 
// ... more code 

Я думаю, что код понятен. Может быть, ваш метод обратных вызовов должен быть частным членом и просто показывать MyEvent как общедоступный. Для маршалирования между char * и String в Интернете есть много примеров; это зависит от кодировки. Чтобы подписаться на событие, создать метод с той же подписью StringEventHandler:

// c++/cli 
wrapperClassInstance->MyEvent += gcnew StringEventHandler(obj, OtherClass::Method); 
// c# 
wrapperClassInstance.MyEvent += obj.Method; 

Я надеюсь, что это поможет вам. - Jairo -

Смежные вопросы