Author Topic: Overriding C++ methods in C#  (Read 1017 times)

0 Members and 1 Guest are viewing this topic.

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

  • Blogger
  • *
  • Posts: 24112
  • Gender: Male
on: December 30, 2010, 01:20
Вызывать C++ из C# не так сложно -- достаточно все методы обернуть в C-подобный вид.

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

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

class ParentStub: public Parent
{
public:
    VoidDelegate onEventDelegate;

    virtual void OnEvent()
    {
        onEventDelegate();
    }

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

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

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

Затем определяем C#-класс:
Code: [Select]
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++-класса как ни в чём не бывало:
Code: [Select]
public Child: Parent
{
     protected override void OnEvent()
     {
         Console.WriteLine("Hello, World!");
     }
}

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

 

With Quick-Reply you can write a post when viewing a topic without loading a new page. You can still use bulletin board code and smileys as you would in a normal post.

Note: this post will not display until it's been approved by a moderator.
Name: Email:
Verification:
√49 Напишите ответ строчными буквами:
«Сто одёжек, все без застёжек» — что это?: