Usuário com melhor resposta
Chamar funções de uma DLL Win32 pelo C#

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
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- Sugerido como Resposta Fabio Galuppo terça-feira, 25 de maio de 2010 18:04
- Marcado como Resposta Harley AraujoModerator segunda-feira, 23 de maio de 2011 17:37
Todas as 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- Sugerido como Resposta Fabio Galuppo terça-feira, 25 de maio de 2010 18:04
- Marcado como Resposta Harley AraujoModerator segunda-feira, 23 de maio de 2011 17:37