我有一个仅具有一个导出功能的DLL:

#ifdef __cplusplus
extern "C"
{
   __declspec(dllexport) IRouter* CreateRouter();
}
#endif


IRouter的界面如下:

class IRouter
{
public:
    virtual bool __stdcall DoSomething(LPCWSTR szCommand) = 0;
    // Call Release() from DLL client to free any memory associated with this object
    virtual bool __stdcall Release() = 0;
};


我有一个具体的类,其接口如下:

class CMyRouter : public IRouter
{
public:
    bool __stdcall DoSomething(LPCWSTR szCommand);
    bool __stdcall Release();
}


如您所料,DLL中包含MyRouter类的实现。

我的单个导出功能的代码如下:

#ifdef __cplusplus
extern "C"
{
    __declspec(dllexport) IRouter* CreateRouter()
    {
        return new CMyRouter;
    }
}
#endif  // __cplusplus


我的问题是:如何从C#客户端访问IRouter派生的对象?

最佳答案

您可以在C ++ / CLI中执行此操作(使用聚合,而不是继承)。例如,在C ++ / CLI中创建一个托管类,该托管类对应并保存指向C ++抽象类IRouter的指针,并提供一些转发方法,例如`DoSomething(string)。然后,您可以在C#中实现其余的托管逻辑。

使用P / Invoke或COM使用该类也是可能的,但与您当前问题的表达形式不完全一致的。

09-08 00:25