Hoje gostaria de mostrar como importar algumas funções nativas do Windows em seu aplicativo usando C#.NET e mostrar como utilizar using de maneira diferente.
Muitas pessoas precisam acessar funções nativas do sistema operacional Windows e para isso é necessário fazer algumas importações acima do método. Mas antes de começar a mostrar, é necessário usar algumas classes do Framework.NET.
using System; using System.Globalization; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using System.Security.Principal; using System.Text;
Junto desses “using” descritos acima, existe uma maneira nova de criar variável local que assume os dados da classe. Primeiro se coloca o nome igualando ao da classe que deseja usar:
using SysComTypes = System.Runtime.InteropServices.ComTypes;
Note que a classe de System.Runtime.InteropServices.ComTypes foi atribuída para a variável SysComTypes. Essa variável pode ser usada dentro da classe em qualquer lugar. É uma maneira interessante para uso de variáveis locais.
Passando agora para a parte de importação nativa do sistema operacional, você precisa colocar no mínimo três linhas de código para cada importação dependendo do método. Em exemplo, para verificar se o login do usuário precisa do código abaixo:
// // advapi32.dll // [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, LogOnType dwLogonType, LogOnProvider dwLogonProvider, out IntPtr phToken); [DllImport("advapi32", CharSet = CharSet.Unicode, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool LogonUser(string lpszUsername, string lpszDomain, IntPtr lpszPassword, LogOnType dwLogonType, LogOnProvider dwLogonProvider, out IntPtr phToken);
A dll nativa é a advapi32 do Windows. Existem outras interfaces disponíveis dessa dll, porém não são muito utilizadas.
Para a dll kernel32 existem outros métodos específicos como pegar a informação do HD local, verificar o status da thread, encontrar arquivo, pegar a memória da máquina e muito mais. Veja alguns exemplos abaixo:
// // kernel32.dll // [DllImport("kernel32", BestFitMapping = false, CharSet = CharSet.Unicode, SetLastError = true, ThrowOnUnmappableChar = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GetVolumeInformation(string lpRootPathName, StringBuilder lpVolumeNameBuffer, int nVolumeNameSize, out int lpVolumeSerialNumber, out int lpMaximumComponentLength, out int lpFileSystemFlags, StringBuilder lpFileSystemNameBuffer, int nFileSystemNameSize); [DllImport("kernel32", SetLastError = true)] internal static extern ExecutionState SetThreadExecutionState(ExecutionState esFlags); [DllImport("kernel32", BestFitMapping = false, CharSet = CharSet.Auto, SetLastError = true, ThrowOnUnmappableChar = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool FindNextFile(SafeFindFileHandle hndFindFile, [In, Out] FindData lpFindFileData); [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)] internal static extern void GlobalMemoryStatus(NativeMemoryStatus lpBuffer); [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] internal static extern bool GlobalMemoryStatusEx(NativeMemoryStatusEx lpBuffer);
Bom, o objetivo foi mostrar apenas como colocar a chamada de funções ou métodos nativos do sistema operacional. Em um próximo artigo posso mostrar como usar esses métodos específicos.
Além dessas dlls, existem outras como oleaut32, setupapi, shell32, shlwapi e ole32.dll. Todas essas existem métodos próprios para uso na linguagem C#.NET ou qualquer outra do framework .NET.
Espero que tenha gostado e qualquer dúvida pode entrar em contato pelo site.
Fonte: Maurício Júnor/IMasters