Agora vou tentar agregar alguma coisa com os códigos e alguns comentários. Os slides da apresentação novamente, caso você não queira mudar de post.
Os códigos de tem foco na necessidade de um código .NET acessar funções escritas em C++, há possibilidade de fazer o processo inverso que apresentarei em um post futuro. Bem caso você não queria ler o resto do post aqui está o link para o repositório dos códigos no gitHub.
Utilizando o C++/CLI ou a técnica de PInvoke o wrapper que permite o acesso do .NET ao C++ está em uma classe gerenciada que contém uma referência de acesso (sendo um objeto ou um função exportada).
O acesso a funções síncronas não requer nenhum detalhe sofisticado na codificação, apenas atenção no tratamento dos tipos de dados como strings e structs. Já no caso de funções assíncronas com callbacks por interface ou método estático é necessário manter os ponteiros de callback vivos, ou seja, evitar que o garbage collector leve-os.
Também vou prometer para um próximo post o debugging com WinDbg nos em ambos os códigos. (Sabe como é, né? Assim me motivo a escrever mais)
domingo, 22 de julho de 2012
quarta-feira, 11 de julho de 2012
Palestra Interop TDC 2012
O TDC 2012 é uma iniciativa muito boa que consegue reunir um grande número de desenvolvedores para trocarem experiências, despertar interesse em novas tecnologias e quem sabe fazer com que cresça a cada ano um nova safra de aficionados por desenvolvimento e inovação em tecnologias digitais.
Infelizmente pude participar apenas da trilha de C/C++, mas foi uma trilha com palestrantes de peso como a do meu amigo Wanderley Caloni (www.caloni.com.br) que apresentou todo o lado esotérico que existe durante a depuração de altíssimo nível e garbo. E mesmo fora da gélida sala de servidores foi aplaudido a cada sample executado.
Tivemos também o Fernando Roberto da Silva (www.driverentry.com.br) que apresentou uma boa palestra sobre o funcionamento de um sistema multicore em seu amago e o desenvolvimento de códigos para esses sistemas. Não foi necessário ser especialista em desenvolvimento de drivers para entender as técnicas apresentadas que, em minha humilde opinião, se aproximam das técnicas de desenvolvimento multi-thread.
Também foram apresentados os temas de gerenciamento de memória (Rodrigo Strauss do www.1bit.com.br) e o que há de novo no C11 & C++11 (Gianni Rossi).
Seguem os slides que apresentei no TDC 2012, assim que possível vou disponibilizar os códigos.
Infelizmente pude participar apenas da trilha de C/C++, mas foi uma trilha com palestrantes de peso como a do meu amigo Wanderley Caloni (www.caloni.com.br) que apresentou todo o lado esotérico que existe durante a depuração de altíssimo nível e garbo. E mesmo fora da gélida sala de servidores foi aplaudido a cada sample executado.
Tivemos também o Fernando Roberto da Silva (www.driverentry.com.br) que apresentou uma boa palestra sobre o funcionamento de um sistema multicore em seu amago e o desenvolvimento de códigos para esses sistemas. Não foi necessário ser especialista em desenvolvimento de drivers para entender as técnicas apresentadas que, em minha humilde opinião, se aproximam das técnicas de desenvolvimento multi-thread.
Também foram apresentados os temas de gerenciamento de memória (Rodrigo Strauss do www.1bit.com.br) e o que há de novo no C11 & C++11 (Gianni Rossi).
Seguem os slides que apresentei no TDC 2012, assim que possível vou disponibilizar os códigos.
segunda-feira, 9 de julho de 2012
Interop .NET x C++
Antes de ler o texto a seguir desarme-se de preconceitos e aceite que cada linguagem de programação tem seu papel e propósito dentro de um sistema.
Minha intenção é apresentar alguns conceitos sobre as técnicas de integração entre código .NET e código dentro da plataforma Microsoft Windows. Um fator importante é de que não vou levantar razões arquiteturais que levam a necessidade existir um sistema composto por mais de uma linguagem de programação.
Então, vamos lá, quando é necessário integrar aplicações desenvolvidas em Visual C++ e .NET existem duas possibilidades (até o momento). A primeira é a utilização de um recurso conhecido como PInvoke que permite o código .NET acessar diretamente funções de uma DLL escrita em VC++. E também há possibilidade de utilizar a linguagem Visual C++.NET, também conhecido como C++/CLI, e escrever código misto.
Ambos os modelos trazem vantagens e desvantagens, então logo vamos tentar identificar qual recurso se encaixa nas necessidades e características de um ambiente. Ah sim, como o assunto é extenso vou dividir ele em algumas partes. A seguir a primeira parte que é o básico do PInvoke.
Parte I - Básico do PInvoke
Vamos começar pela codificação para termos um pouco mais de ação por aqui. A seguir o código básico em VC++ para gerar uma DLL Win32 com uma função, que criativamente chamei de AddTwoIntegers. Use o wizard do Visual Studio para criar uma DLL. Na figura 1 está o código gerado pelo Visual Studio (método DllMain) e também há o método que será executado através do código .NET.
O método AddTwoIntegers é muito simples para que seja possível apresentar todos os elementos que compõem a integração através do PInvoke. É importante não esquecer-se de adicionar ao seu projeto VC++ um arquivo .def, como o da figura 2.
Este arquivo serve que para que no momento que a DLL é carregada pelo código .NET as devidas funções estejam visíveis e acessíveis. Para notar a diferença basta compilar sua DLL sem o arquivo .def e abrir-lá com o dependency walker como na figura 3 e notar que não há nenhuma funções exporta para acesso.
Já na figura 4 é possível perceber que o método AddTwoIntegers está disponível .
Agora que temos DLL Win32 compilada e exportando corretamente o método que queremos, vamos para a utilização da DLL pelo .NET. Note que na figura 4 a primeira instrução é using System.Runtime.InteropServices para que seja possível utilizar todos os membros desse namespace.
Então é definida a carga da DLL através do atributo DllImport, onde os parâmetros passados são:
“Unmanaged.dll”: path completo para a DLL a ser carregada. Como foi definido apenas o nome da DLL ela será carregada da pasta onde estiver o executável.
EntryPoint = ”AddTwoIntegers”: Método exportado pela DLL.
CharSet = CharSet.Auto: Defini como as sequências de caracteres são exportados, valores possível Ansi ou Unicode. Defini como Auto para que a plataforma decida qual o tipo adequado.
CallingConvention = CallingConvention.Cdecl: padrão para chamada do método. Vulgarmente isto infere na maneira como a plataforma vai empilhar a chamado do método na heap.
Após a definição do atributo e seus parâmetros é necessário definir a assinatura do método através de: public static extern. Para o primeiro exemplo estamos utilizando apenas dois int basta copiar a assinatura do código não gerenciado.
O método NativeAdd, da figura 5, defini um método que outras classes .NET possam acessar o método importado da DLL servindo como um wrapper. Este foi o ultimo passo agora basta fazer um aplicativo para teste como na figura 6 e verificar o funcionamento.
Minha intenção é apresentar alguns conceitos sobre as técnicas de integração entre código .NET e código dentro da plataforma Microsoft Windows. Um fator importante é de que não vou levantar razões arquiteturais que levam a necessidade existir um sistema composto por mais de uma linguagem de programação.
Então, vamos lá, quando é necessário integrar aplicações desenvolvidas em Visual C++ e .NET existem duas possibilidades (até o momento). A primeira é a utilização de um recurso conhecido como PInvoke que permite o código .NET acessar diretamente funções de uma DLL escrita em VC++. E também há possibilidade de utilizar a linguagem Visual C++.NET, também conhecido como C++/CLI, e escrever código misto.
Ambos os modelos trazem vantagens e desvantagens, então logo vamos tentar identificar qual recurso se encaixa nas necessidades e características de um ambiente. Ah sim, como o assunto é extenso vou dividir ele em algumas partes. A seguir a primeira parte que é o básico do PInvoke.
Parte I - Básico do PInvoke
Vamos começar pela codificação para termos um pouco mais de ação por aqui. A seguir o código básico em VC++ para gerar uma DLL Win32 com uma função, que criativamente chamei de AddTwoIntegers. Use o wizard do Visual Studio para criar uma DLL. Na figura 1 está o código gerado pelo Visual Studio (método DllMain) e também há o método que será executado através do código .NET.
O método AddTwoIntegers é muito simples para que seja possível apresentar todos os elementos que compõem a integração através do PInvoke. É importante não esquecer-se de adicionar ao seu projeto VC++ um arquivo .def, como o da figura 2.
Este arquivo serve que para que no momento que a DLL é carregada pelo código .NET as devidas funções estejam visíveis e acessíveis. Para notar a diferença basta compilar sua DLL sem o arquivo .def e abrir-lá com o dependency walker como na figura 3 e notar que não há nenhuma funções exporta para acesso.
Já na figura 4 é possível perceber que o método AddTwoIntegers está disponível .
Agora que temos DLL Win32 compilada e exportando corretamente o método que queremos, vamos para a utilização da DLL pelo .NET. Note que na figura 4 a primeira instrução é using System.Runtime.InteropServices para que seja possível utilizar todos os membros desse namespace.
Então é definida a carga da DLL através do atributo DllImport, onde os parâmetros passados são:
“Unmanaged.dll”: path completo para a DLL a ser carregada. Como foi definido apenas o nome da DLL ela será carregada da pasta onde estiver o executável.
EntryPoint = ”AddTwoIntegers”: Método exportado pela DLL.
CharSet = CharSet.Auto: Defini como as sequências de caracteres são exportados, valores possível Ansi ou Unicode. Defini como Auto para que a plataforma decida qual o tipo adequado.
CallingConvention = CallingConvention.Cdecl: padrão para chamada do método. Vulgarmente isto infere na maneira como a plataforma vai empilhar a chamado do método na heap.
Após a definição do atributo e seus parâmetros é necessário definir a assinatura do método através de: public static extern. Para o primeiro exemplo estamos utilizando apenas dois int basta copiar a assinatura do código não gerenciado.
O método NativeAdd, da figura 5, defini um método que outras classes .NET possam acessar o método importado da DLL servindo como um wrapper. Este foi o ultimo passo agora basta fazer um aplicativo para teste como na figura 6 e verificar o funcionamento.
Assinar:
Postagens (Atom)





