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

Ответ

Обратите внимание: данное сообщение не будет отображаться, пока модератор не одобрит его.
Ограничения: максимум вложений в сообщении — 3 (3 осталось), максимальный размер всех файлов — 300 КБ, максимальный размер одного файла — 100 КБ
Снимите пометку с вложений, которые необходимо удалить
Перетащите файлы сюда или используйте кнопку для добавления файлов
Вложения и другие параметры
Проверка:
Оставьте это поле пустым:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

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

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

Сообщения в этой теме

Автор Алексей Гринь
 - декабря 30, 2010, 00:20
Вызывать 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'у было бы кстати придумать что-то для автоматизации этого процесса. Интересно, какой тут оверхед.