2015-02-02 3 views
0

에서 액세스 할 수 없습니다 ++/CLI일반 목록 내가 C에 새로운 오전 지적하여 서문 싶어 CLI

우리는 ++ 응용 프로그램 프로젝트가 (우리는 "응용 프로그램"전화 할게) 관리되지 않는 C 하나의 해결책을 가지고 있습니다 DLL (우리는 "Remoting"이라고 부름)에 빌드하는 C# .net 리모팅 프로젝트와이 둘 사이의 인터페이스를위한 CLI 프로젝트 ("Bridge"라고 부름)를 제공합니다.

모든 것은 우리가 성공적으로 원격에서 이벤트를 수신 및 응용 프로그램의 메소드를 호출 할 수 있습니다 다리에 IMyEventHandler 인터페이스를 가지고 작동하는 것 같군. 이 모든 노력

void Bridge::OnReceiveServerEvent(IMyEvent^ aEvent) 
{ 
    // Determine event type 
    ... 
    Handle_SpecificEventType(); 
} 

:

브리지 구현에서
#ifndef EVENTS_HANDLER_INTERFACE_H_INCLUDED 
#include "EventsHandlerInterface.h" 
#endif 

#define DLLEXPORT __declspec(dllexport) 
#ifdef __cplusplus 
extern "C" 
{ 
#endif 
    DLLEXPORT bool RegisterAppWithBridge(IMyEventsHandler * aHandler); 
    DLLEXPORT void PostEventToServer(AppToServerEvent eventType); 
    DLLEXPORT void PollEventsFromServer(); 
#ifdef __cplusplus 
} 
#endif 

우리가 이벤트를 처리하고 이벤트가 그것이 유형에 따라 방법을 가지고, 우리는 그 정확한 유형을 처리하기위한 다른 방법을 호출 지금까지 괜찮아. 알려진 유형의 이벤트에 대한 처리기를 호출하면 일반 인터페이스 유형에서 직접 처리 할 수 ​​있습니다. 이것이 바로 우리가 그 문제를보기 시작하는 곳입니다. 이러한 모든 이벤트 유형은 C#에서 생성 된 다른 DLL에서 정의됩니다. int 또는 문자열이있는 간단한 이벤트는 정상적으로 작동하지만 다른 DLL에 정의 된 다른 유형의 목록 (우리는 "AnotherType"이라고 함)을 포함하는이 SpecificEventType을 갖습니다. 필요한 모든 DLL이 참조로 추가되었으며 불평없이 AnotherType을 gcnew 할 수 있습니다.

그러나 AnotherType 요소를 목록에서 가져 오면 빌드 오류가 발생합니다. "C2526 'System :: Collections :: Generic :: List :: GetEnumerator'C 연결 함수가 C++ 클래스를 반환 할 수 없습니다.

void Bridge::Handle_SpecificEventType(IMyEvent ^evt) 
{ 
    SpecificEventType ^e = (SpecificEventType ^)evt; 

    // We can pull the list itself, but accessing elements gives error 
    System::Collections::Generic:List<AnotherType ^> ^lst = e->ThatList; 

    // These all cause error 
    array<AnotherType ^> ^arr = lst->ToArray(); 

    AnotherType ^singleElement = lst[0]; 

    for each(AnotherType ^loopElement in lst){} 
} 

우리가 C#을 DLL에 정의 된 새로운 C#을 서버에서 .NET 원격을 통해 전송 관리 이벤트를 취하려고,이 일을하는 이유를 명확히하고, 이전 관리되지 않는 C++ 응용 프로그램을 "번역"하려면 . 그래서 최종 목표는 C# 유형 "SpecificEventType"의 복사본을 생성하고 관리되지 않는 "SpecificEventType_Unmanaged"로 번역하고 그냥 데이터와 응용 프로그램에 전화를하는 것입니다

// Declared in Bridge.h and gets assigned from DLLEXPORT RegisterGameWithBridge method. 
IMyEventsHandler *iApplicationEventHandler; 

// Bridge.cpp 
void Bridge::Handle_SpecificEventType(IMyEvent ^evt) 
{ 
    ... Convert SpecificEventType to SpecificEventType_Unmanaged 
    iApplicationEventHandler->Handle_SpecificEvent(eventUnmanaged); 
} 

모두 작동하는 것 같군이 메시징 설정을 올바르게 했음에도 불구하고 일반 목록의 요소를 제공하고 싶지는 않습니다. 데이터를 가져 오지 않고 응용 프로그램으로 보내지는 이벤트의 관리되지 않는 버전을 작성하지 못하게합니다.

나는 다시 내가 CLI 새로운 오전과 지금 몇 년 동안 C++를 터치 없었어요, 내가 잘 설명했다 희망 - 그래서 어떤 추가 정보가 필요한 경우 알려 주시기 바랍니다.

미리 도움을 청하십시오.

답변

0

브리지 구현의 모든 메소드는 통근 "C"블록의 내부에 여전히했기 때문에 문제가되었다 밝혀졌습니다. 많은 시간이 낭비되었습니다.