2012-03-19 3 views
1

У меня есть DLL, которая имеет функцию только один экспорт:C# потребляет C++ 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(); 
} 

Как и следовало ожидать, реализация для класса MyRouter включена в DLL.

Код для моей единственной функции экспорта выглядит следующим образом:

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

Мой вопрос: Как я могу получить доступ к IRouter производного объекта из C# клиента?

ответ

0

Вы можете сделать это в C++/CLI (используя агрегацию, а не наследование). Например, создайте управляемый класс в C++/CLI, который соответствует и удерживает указатель на абстрактный класс C++ IRouter, и предоставляет несколько методов переадресации, таких как `DoSomething(string). Затем вы можете реализовать остальную управляемую логику в C#.

Возможно также, но не совсем согласовано с вашей текущей формулировкой вопроса, чтобы использовать класс, используя P/Invoke или COM.

+0

Благодарим за помощь. Если я правильно понял, мне нужно будет написать еще одну C++/CLI DLL, чтобы выступать в качестве посредника между моей родной C++ DLL и моим клиентом C#. Вы знаете пример такого решения для агрегации C++/CLI? И вы правы, я планировал использовать класс, используя P/Invoke. – markiemooster

+0

@markiemooster - вам не понадобится P/Invoke, если вы идете с C++/CLI. Вам просто нужно создать проект C++/CLI в Visual Studio и изучить основы языка (например, [здесь] [1]) (Также вы получили ответ Нангидрина, который обращается к пути P/Invoke, но это крайне необычно и неудобно использовать P/Invoke с помощью методов класса.) –

+0

@markiemooster - я забыл вставить ссылку: [http://www.codeproject.com/Articles/19354/Quick-C-CLI-Learn-C- CLI-in-less-than-10-minutes] –

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