none
Chamar funções de uma DLL Win32 pelo C# RRS feed

  • Pergunta

  • Olá Pessoal,

    Eu sei que o C# consegue chamar funções de uma DLL Win32 perfeitamente. Também sei como fazer isso numa boa, quer dizer, as do Windows.

    Eu preciso acessar as funções do client do Subversion, como fazer isso?
    Pois no client eu sei que tem Struct e eu preciso fazer o mesmo no C#, porem eu tenho que colocar uns atributos na struct do C# para poder funcionar. Existe alguma forma de gerar essa interface de forma simples? Algum programa que gere estes comandos?

    Agradeço,
    Leonardo

    quarta-feira, 14 de abril de 2010 12:38

Respostas

  • Este tópico de interop é um pouco denso. Depende de entendimentos e conceitos que é dificil sintetizar num post.

    Abaixo tem um exemplo de P/Invoke, que é o que vc vai precisar neste caso. No entanto, este é um dos exemplos do curso que ministro de C++/CLI, portanto está escrito em C++/CLI. É facil adapta-lo para C#.

    #using <mscorlib.dll>

    using namespace System;
    using namespace System::Runtime;
    using namespace System::Runtime::InteropServices;

    [StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi)] 
    value struct OSVERSIONINFOEX
    {
     Int32 dwOSVersionInfoSize; 
     Int32 dwMajorVersion; 
     Int32 dwMinorVersion; 
     Int32 dwBuildNumber; 
     Int32 dwPlatformId;

     [MarshalAs(UnmanagedType::ByValTStr, SizeConst=128)]
     String^ szCSDVersion;

     UInt16 wServicePackMajor; 
     UInt16 wServicePackMinor; 
     UInt16 wSuiteMask;
     Byte wProductType; 
     Byte wReserved;
    };

    [DllImport("kernel32")]
    extern "C" Boolean GetVersionEx( [In, Out] OSVERSIONINFOEX% osvi );

    void Main()
    {
     OSVERSIONINFOEX osvi;
     osvi.dwOSVersionInfoSize = Marshal::SizeOf( osvi );

     Boolean result = GetVersionEx( osvi );
    }

    Se quiser facilitar sua vida para mapeamento de APIs do Windows com C# acesse: http://www.pinvoke.net/

    Como seu caso é uma DLL não Windows API, será necessário entender como é o mecanismo de P/Invoke e Marshalling... De repente este artigo pode te ajudar: http://msdn.microsoft.com/en-us/library/aa446536.aspx


    Fabio Galuppo
    terça-feira, 27 de abril de 2010 14:52

Todas as Respostas

  • Minha explicação acima está ruim?

    Ou o que estou procurando não existe mesmo?

    Agradeço,
    Leonardo

    quinta-feira, 22 de abril de 2010 19:56
  • Eu acho que você conseguirá maior efetividade nas suas respostas se direcionar sua pergunta para o fórum de .NET/C#.

     

    Abraços, cox


    cox
    quinta-feira, 22 de abril de 2010 22:11
  • Este tópico de interop é um pouco denso. Depende de entendimentos e conceitos que é dificil sintetizar num post.

    Abaixo tem um exemplo de P/Invoke, que é o que vc vai precisar neste caso. No entanto, este é um dos exemplos do curso que ministro de C++/CLI, portanto está escrito em C++/CLI. É facil adapta-lo para C#.

    #using <mscorlib.dll>

    using namespace System;
    using namespace System::Runtime;
    using namespace System::Runtime::InteropServices;

    [StructLayout(LayoutKind::Sequential, CharSet = CharSet::Ansi)] 
    value struct OSVERSIONINFOEX
    {
     Int32 dwOSVersionInfoSize; 
     Int32 dwMajorVersion; 
     Int32 dwMinorVersion; 
     Int32 dwBuildNumber; 
     Int32 dwPlatformId;

     [MarshalAs(UnmanagedType::ByValTStr, SizeConst=128)]
     String^ szCSDVersion;

     UInt16 wServicePackMajor; 
     UInt16 wServicePackMinor; 
     UInt16 wSuiteMask;
     Byte wProductType; 
     Byte wReserved;
    };

    [DllImport("kernel32")]
    extern "C" Boolean GetVersionEx( [In, Out] OSVERSIONINFOEX% osvi );

    void Main()
    {
     OSVERSIONINFOEX osvi;
     osvi.dwOSVersionInfoSize = Marshal::SizeOf( osvi );

     Boolean result = GetVersionEx( osvi );
    }

    Se quiser facilitar sua vida para mapeamento de APIs do Windows com C# acesse: http://www.pinvoke.net/

    Como seu caso é uma DLL não Windows API, será necessário entender como é o mecanismo de P/Invoke e Marshalling... De repente este artigo pode te ajudar: http://msdn.microsoft.com/en-us/library/aa446536.aspx


    Fabio Galuppo
    terça-feira, 27 de abril de 2010 14:52