Создание моста C ++ в смешанном режиме из C в C #? - PullRequest
4 голосов
/ 06 ноября 2008

Я надеюсь, что кто-то может помочь мне с этим, я в основном разработчик C #, так что мой Навыки C и C ++ плохие. У меня есть родной C DLL, который является плагином большее приложение. Я кросс-компилировать эту DLL для Windows на Linux используя gcc.

В родной dll, когда я создаю D3DSurface, я хочу вызвать функцию в смешанном режиме C ++ DLL и передать указатель на поверхность вдоль с Hwnd / ручкой. Этот смешанный режим C ++ должен затем вызвать мой C # управляемый код.

В качестве примера, в C я хочу сделать следующее:

Hwnd handle;
LPDIRECT3DSURFACE d3dtarg;
SurfaceCreated(handle, d3dtarg);

В C # я хочу, чтобы это вызывалось из сборки смешанного режима

public static class D3DInterop
{
    public static void SurfaceCreated(IntPtr handle, IntPtr surface)
    {
        //do work
    }
}

Так как я сосу на C ++, я просто хочу знать, может ли кто-нибудь дать мне Пример того, что мне нужно, чтобы код для смешанного режима DLL. Я также хотел бы не нужно компилировать dll смешанного режима с заголовками DirectX, так это есть способ, которым я могу привести «C» LPDIRECT3DSURFACE в общий указатель? В C # я все равно просто использую IntPtr.

Ответы [ 3 ]

3 голосов
/ 07 ноября 2008

Создайте управляемый C ++ (C ++ / CLI) DLL-проект, который будет вызываться из C, а также будет ссылаться на другие сборки .Net (а именно на ваш C #). Тогда все, что нужно сделать мосту C ++ / CLI, - это преобразовать типы данных из HWND в IntPtr и т. Д.

2 голосов
/ 06 ноября 2008

Вы изучили Microsoft XNA ? Предположительно он управлял оболочками для DirectX.

0 голосов
/ 06 ноября 2008

Вы можете использовать void * в DLL смешанного режима. Существует неявное приведение от указателя на что-либо (включая указатель на IDirect3DSurface) до void *. Затем вы можете привести этот указатель к IntPtr.

...