Pergunta

Estou brincando com um pequeno mecanismo de jogo 2D em C# e decidi usar Direct2D e DirectWrite para renderização.Eu sei que existe o Windows API Code Pack e o SlimDX, mas eu realmente gostaria de me aprofundar e escrever uma interface do zero.Estou tentando fazer isso sem C++ gerenciado, mas Direct2D e DirectWrite não parecem usar objetos COM tradicionais.Eles definem interfaces que derivam de IUnknown, mas parece não haver nenhuma maneira de realmente usá-los em C# com interoperabilidade COM.Existem IIDs em d2d1.h, mas sem CLSID.

Claro, sou realmente novo na interoperabilidade COM, então talvez esteja faltando alguma coisa.Alguém pode lançar alguma luz sobre esta situação?

Foi útil?

Solução

Entendi. Você não pode criar os objetos diretamente, mas d2d1.dll contém uma exportação chamada D2D1CreateFactory que retorna um ID2DFactory interface. Usando isso, você pode implementar um wrapper Direct2D sem C ++ gerenciado.

public static class Direct2D1Util {
    public const string IID_ID2D1Factory =
        "06152247-6f50-465a-9245-118bfd3b6007";

    [DllImport("d2d1.dll", PreserveSig = false)]
    [return: MarshalAs(UnmanagedType.Interface)]
    private static extern object D2D1CreateFactory(D2D1_FACTORY_TYPE factoryType,
        [MarshalAs(UnmanagedType.LPStruct)] Guid riid,
        D2D1_FACTORY_OPTIONS pFactoryOptions);

    public static ID2D1Factory CreateFactory() {
        D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
        object factory = D2D1CreateFactory(
            D2D1_FACTORY_TYPE.D2D1_FACTORY_TYPE_SINGLE_THREADED,
            new Guid(IID_ID2D1Factory), opts);
        return (ID2D1Factory)factory;
    }
}

Não vou incluir todos os tipos, porque todos eles estão definidos em d2d1.h, mas aqui está como usar o código para obter uma fábrica:

ID2DFactory factory = Direct2D1Util.CreateFactory();

Certifique -se de que você ID2DFactory interface tem o apropriado Guid e InterfaceType(ComInterfaceType.InterfaceIsIUnknown) atributos.

Outras dicas

O "Windows® API Code Pack para Microsoft® .NET Framework" possui bibliotecas gerenciadas que permitem acesso a Direct2D e DirectWrite.

http://code.msdn.microsoft.com/WindowsAPICodePack

Atualizar

Embora os wrappers DirectX sejam escritos em C++ gerenciado, eles produzem bibliotecas gerenciadas.Pela aparência, eles podem ser usados ​​em C#.Parece haver muitos exemplos incluídos no download que fazem exatamente isso, ou seja,use as bibliotecas wrapper gerenciadas do C++ Direct do C#.

Usar os recursos do Windows 7 em meu próprio aplicativo C # seria muito bom, então estou instalando o SDK do Window7 (para que eu possa construir a solução C++ DirectX gerenciada) e darei uma festa em tudo.

Estou seguindo as instruções em:

http://blogs.msdn.com/msaleh/archive/2009/08/25/introduzindo-directx-features-of-windows-api-code-pack.aspx

Atualização 2

Seguindo as instruções no link acima, compilei as bibliotecas C++ gerenciadas e você pode realmente usá-las em C# com muita facilidade.

Agora não tenho certeza se entendi corretamente, mas você está apenas procurando uma maneira de usar Direct2D e DirectWrite de C# ou precisa ser COM ou P\Invoke.

Eu duvido muito que exista um wrapper COM, pois é uma tecnologia incompatível.COM não é muito bem projetado para o tipo de padrões de chamada de método de alta frequência que você obtém na programação gráfica - é muito lento.

Se você realmente deseja fazer P\Invoke, você pode sempre olhar os arquivos de cabeçalho do DirectX (no SDK do Windows 7) e usar uma ferramenta para criar todos os seus stubs de chamada P\Invoke, por exemplo.

http://www.pinvoker.com/

Provavelmente seria uma grande PITA desenvolver um invólucro dessa maneira.

Há um projeto no CodePlex que fornece invólucros gerenciados para o Direct2D. Não faço ideia se é bom, mas provavelmente o código -fonte ajudará você a começar.

http://direct2dsharp.codeplex.com/

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top