无法从CLI访问C#DLL中的通用列表

时间:2015-02-02 19:16:34

标签: dll c++-cli clr unmanaged .net-remoting

想要通过指出我是C ++ / CLI

的新手来做序

我们有一个带有非托管C ++应用程序项目的解决方案(我们将其称为“应用程序”)和一个构建为DLL的C#.net远程项目(我们称之为“远程处理”),以及一个用于连接的CLI项目两者之间(我们称之为“桥”)。

一切似乎都在工作,我们在Bridge中有一个IMyEventHandler接口,可以成功接收来自Remoting的事件,并且可以调用Application中的方法。

#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

在Bridge实现中,我们有一个处理事件的方法,根据它的事件类型,我们将调用一个不同的方法来处理这个确切的类型:

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

到目前为止,一切正常。一旦我们为已知类型的事件调用处理程序,我们就可以直接从通用接口类型转换为它。这就是我们开始看到问题的地方。所有这些事件类型都是在从C#生成的另一个DLL中定义的。只有整数或字符串的简单事件工作正常,但我们有这个SpecificEventType,它包含所有在另一个DLL中定义的其他类型的列表(我们称之为“AnotherType”)。所有必需的DLL都已添加为引用,我能够在没有抱怨的情况下gcnew一个AnotherType。

但是,一旦我尝试从列表中获取AnotherType元素,我们就会看到构建错误:“C2526'Cystem :: 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 ++了 - 所以如果需要任何其他细节,请告诉我。

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:0)

原来问题是因为Bridge实现中的所有方法仍然在extern“C”块中。失去了这么多时间 - 这么简单的问题。