Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Overriding C++ methods in C#

Автор Алексей Гринь, декабря 30, 2010, 00:20

0 Пользователи и 1 гость просматривают эту тему.

Алексей Гринь

Вызывать C++ из C# не так сложно -- достаточно все методы обернуть в C-подобный вид.

Но, блин, есть C++ API, где нужно наследоваться от класса и переопределять некоторые методы.
А тут уже когнитивный диссонанс.

Выход прост, но извращён -- на стороне С++-клея мы определяем дочерний класс, который переопределяет нужные методы так, чтобы они вызывали поля-function pointers:
typedef void(*VoidDelegate)();

class ParentStub: public Parent
{
public:
    VoidDelegate onEventDelegate;

    virtual void OnEvent()
    {
        onEventDelegate();
    }

   ParentStub(VoidDelegate onEvent): onEventDelegate(onEvent) {}
};


Затем определяем функцию, создающую этот класс:
ParentStub* CreateParentStub(VoidDelegate onEvent) { return new ParentStub(onEvent); }

Затем на стороне C# определяем
internal delegate void VoidDelegate();

[DllImport(DllName)]
internal static extern IntPtr CreateParentStub(VoidDelegate onEvent);


Затем определяем C#-класс:
public class Parent: NativeObject
{
    private VoidDelegate onEventHandler;

    public Parent()
    {
       this.onEventHandler = new VoidDelegate(onEventStub);
       SetHandle(NativeMethods.CreateParentStub(this.onEventHandler));
    }

    private void onEventStub() { OnEvent(); }

    protected abstract void OnEvent();
}


Всё. Теперь наконец-то можно переопределять методы C++-класса как ни в чём не бывало:
public Child: Parent
{
     protected override void OnEvent()
     {
         Console.WriteLine("Hello, World!");
     }
}


Microsoft'у было бы кстати придумать что-то для автоматизации этого процесса. Интересно, какой тут оверхед.
肏! Τίς πέπορδε;

Быстрый ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.

Имя:
Имейл:
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:

√36:
ALT+S — отправить
ALT+P — предварительный просмотр