创建一个从C到C#的混合模式C++桥

Creating a Mixed Mode C++ Bridge from C to C#?

本文关键字:混合 模式 C++ 一个 创建      更新时间:2023-10-16

我希望有人能帮我,我主要是一名C#开发人员,所以我的C和C++技能不好。我有一个本机的C dll,它是更大的应用程序。我在linux上为windows交叉编译这个dll使用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编写代码的示例。我也想不必编译带有directx标头的混合模式dll有一种方法可以将"C"LPDIRECT3DSURFACE转换为泛型指针?在C#中,我只是使用IntPtr。

创建一个可从C调用的托管C++(C++/CLI)DLL项目,该项目还可以引用其他.Net程序集(即C#程序集)。然后,您的C++/CLI桥所要做的就是将数据类型从HWND转换为IntPtr等。

您研究过Microsoft XNA吗?据说它已经管理了DirectX的包装器。

您可以在混合模式DLL中使用void *。存在从指向任何内容的指针(包括指向IDirect3DSurface的指针)到void *的隐式转换。然后可以将该指针强制转换为IntPtr