SlideShare ist ein Scribd-Unternehmen logo
1 von 47
ASP.NET MVC – C#4 – COM Interop e Variância Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net
Online @ ,[object Object]
Blog técnico: http://unplugged.giggio.net
Site: http://giovannibassi.com
.Net Architects: Grupo: http://dotnetarchitects.net  Online: http://tinyurl.com/DotNetArch
Evento Palestras: Programando com prazer com DomainDriven Design (DDD) Utilizando Injeção de dependência com Unity (Enterprise Library) ASP.Net MVC: tome seu HTML de volta ORM - Sendo preguiçoso com Nhibernate Testes: garantindo que seu código faz o que você quer Data: 27/Junho Local: Unip Tatuapé - São Paulo/SP Valor: R$ 50 http://dotnetarchitects.net/dnad2009
Agenda
Ferramental C# 4.0 (Visual C# 2010) está presente no Visual Studio 2010 Beta 1 lançado em Maio Download do Beta tem apenas 1.3 GB, disponível em: http://tinyurl.com/vs10b1 Também no VS10: VB X F# DLR (suporte para IronRuby, IronPython, etc...)
4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
4 novidades Webcast da parte 1 Dia 04/6 Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM Agora!
COM Interop
COM Interop Não precisamos mais da palavra-chave ref(o compilador coloca sozinho) Não precisamos de cast de tipos de valor para object Com o suporte de parâmetros opcionais e nomeados, passamos só o necessário Igualzinho ao que há no VB.Net desde o .Net 1.0 e VB 7 (2002) Temos ainda opção de mesclar o assembly de interop
COM Interop Como era antes? ApplicationClassWordApp = newApplicationClass();   WordApp.Visible = true;   objectmissing = System.Reflection.Missing.Value;   objectreadOnly = false;   objectfileName = "Documento.docx";   Word.Documentdoc= WordApp.Documents.Open( reffileName, refmissing, refreadOnly, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing);
COM Interop Como é no VB? DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True)
COM Interop Como é agora? var WordApp = newApplicationClass();   WordApp.Visible = true;   stringfileName = "Documento.docx";   vardoc = WordApp.Documents.Open( fileName, ReadOnly:false);
COM Interop VB e C# lado a lado: var WordApp = newApplicationClass();   WordApp.Visible = true;   stringfileName = "Documento.docx";   vardoc= WordApp.Documents.Open( fileName, ReadOnly:false); C# DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True) VB
COM Interop O que é compilado: ApplicationWordApp = (Application) Activator.CreateInstance( Type.GetTypeFromCLSID(newGuid("000209FF-0000-0000-C000-000000000046"))); WordApp.Visible = true; stringfileName = "Documento.docx"; object <>r__ComRefCallLocal0 = fileName; object <>r__ComRefCallLocal1 = false; object <>r__ComRefCallLocal2 = Type.Missing; object <>r__ComRefCallLocal3 = Type.Missing; object <>r__ComRefCallLocal4 = Type.Missing; object <>r__ComRefCallLocal5 = Type.Missing; object <>r__ComRefCallLocal6 = Type.Missing; object <>r__ComRefCallLocal7 = Type.Missing; object <>r__ComRefCallLocal8 = Type.Missing; object <>r__ComRefCallLocal9 = Type.Missing; object <>r__ComRefCallLocala = Type.Missing; object <>r__ComRefCallLocalb = Type.Missing; object <>r__ComRefCallLocalc = Type.Missing; object <>r__ComRefCallLocald = Type.Missing; object <>r__ComRefCallLocale = Type.Missing; object <>r__ComRefCallLocalf = Type.Missing; objectaDoc = WordApp.Documents.Open( ref <>r__ComRefCallLocal0,     ref <>r__ComRefCallLocal2,  ref <>r__ComRefCallLocal1,     ref <>r__ComRefCallLocal3,  ref <>r__ComRefCallLocal4,     ref <>r__ComRefCallLocal5,  ref <>r__ComRefCallLocal6,     ref <>r__ComRefCallLocal7,  ref <>r__ComRefCallLocal8,     ref <>r__ComRefCallLocal9, ref <>r__ComRefCallLocala,     ref <>r__ComRefCallLocalb,  ref <>r__ComRefCallLocalc,     ref <>r__ComRefCallLocald,  ref <>r__ComRefCallLocale,     ref <>r__ComRefCallLocalf);
COM Interop Mesclando o assembly de interop
Demo Demo COM Interop
Dúvidasatéaqui?
Variância
Variância O que é variância? Define como ocorrem as conversões entre tipos Covariância Permite conversões do mais específico para o mais genérico Contravariância Permite conversões do mais genérico para o mais específico Invariância Permite conversões apenas para o mesmo tipo
Variância Contravariância Covariância A flecha indica a conversão
Variância Já temos covariância no C# 3: Em arrays: 		string[] textos = {}; 		object[] objetos = textos; De métodos para delegates (no retorno): staticstringRetornaString() {} Func<object> func = RetornaString;
Variância Já temos contravariância no C# 3: De métodos para delegates (nos parâmetros): staticvoidRecebeUmObjeto(objectobj) { } 		Action<string> func3 = RecebeUmObjeto;
Variância Mas não há variância entre tipos genéricos no C# 3 IList<string> textos = newList<string>(); IList<object> objetos = textos; Não compila no C# 3.0
Variância Porque não? IList<string> textos = newList<string>(); IList<object> objetos = textos; objetos.Add(newButton()); Um botão não é uma string
Variância Mas assim funciona... objetos[0] = newButton(); Perigo em tempo de execução Além do perigo,  checagemem tempo de execução causa overhead
Dúvidasatéaqui?
Variância Classe Contravariante Covariante Dado
Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado
Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado in out
Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable {     IEnumerator<T> GetEnumerator(); }
Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable {     IEnumerator<T> GetEnumerator(); } Se consigoenumerarmamíferos,  consigoenumeraranimais
Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante): IEnumerable<string> textos = ObterEnumerador();   IEnumerable<object> objetos = textos;
Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T>   {       int Compare(T x, T y);   } 
Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T>   {       int Compare(T x, T y);   }   Se consigocompararanimais,  consigocompararmamíferos
Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): IComparer<object> comparadorObjetos; IComparer<string> comparadorStrings = comparadorObjetos;
Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> 	(T1 arg1, T2 arg2);
Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> 	(T1 arg1, T2 arg2);
Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante e contravariante):
Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): Func<Animal, Macaco> ConverteParaMacaco =     animal =>     { varmacaco = animal asMacaco; if (macaco != null) returnmacaco; returnnull;     }; Func<Mamifero, Mamifero> PassaUmMamiferoERetornaUmMamifero =  ConverteParaMacaco;
Variância Limitações Só tipos de referência (structs e tipos primitivos não são permitidos) Parâmetros out e ref são sempre invariantes 	Todos esses são inválidos: publicdelegatevoidAlgumDelegate<in T>(ref T valor);publicdelegatevoidAlgumDelegate<out T>(ref T valor); publicdelegatevoidAlgumDelegate<in T>(out T valor); publicdelegatevoidAlgumDelegate<out T>(out T valor);
Demo Demo Variância
Revista
http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4 Resources) http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx (Eric Lippert - Microsoft)=> Traduzidopelo Felipe Fujiy: http://blog.fujiy.net/blog/category/Covariancia-e-Contravariancia.aspxhttp://unplugged.giggio.net/unplugged/?tag=/c%234 (Giovanni Bassi - MVP)http://renatoguimaraes.spaces.live.com (RenatoGuimarães – MVP)

Weitere ähnliche Inhalte

Ähnlich wie C#4 COM Interop e Variância

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresNovidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresComunidade NetPonto
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisMarinho Brandão
 
Apostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfvApostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfverickrodrigo23
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaElaine Naomi
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Daniel Makiyama
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaLoiane Groner
 
Campus Party Brasil 2017: Angular 2 #cpbr10
Campus Party Brasil 2017: Angular 2 #cpbr10Campus Party Brasil 2017: Angular 2 #cpbr10
Campus Party Brasil 2017: Angular 2 #cpbr10Loiane Groner
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de softwarericardophp
 
JS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IonicJS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IoniciMasters
 
Ionic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxIonic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxLoiane Groner
 
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoEvoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoRafael Portela
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013Giovanni Bassi
 
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...JP Clementi
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4CDS
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5Diego Pacheco
 

Ähnlich wie C#4 COM Interop e Variância (20)

Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry PiresNovidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
Novidades do CSharp 4.0 - C. Augusto Proiete & Henrry Pires
 
Django - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes PlugaveisDjango - Criando Aplicacoes Plugaveis
Django - Criando Aplicacoes Plugaveis
 
Apostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfvApostila_JavaScript_pela_axademia_ardkgfv
Apostila_JavaScript_pela_axademia_ardkgfv
 
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a diaSobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
Sobre code smells, refactoring e design: como SOLID pode te ajudar no dia a dia
 
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
Aprendendo Na Prática: Aplicativos Web com HTML5, Angular.js, Twitter Bootstr...
 
FAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e CordovaFAESA Computação Móvel: Introducao a Phonegap e Cordova
FAESA Computação Móvel: Introducao a Phonegap e Cordova
 
Campus Party Brasil 2017: Angular 2 #cpbr10
Campus Party Brasil 2017: Angular 2 #cpbr10Campus Party Brasil 2017: Angular 2 #cpbr10
Campus Party Brasil 2017: Angular 2 #cpbr10
 
PHPUnit e teste de software
PHPUnit e teste de softwarePHPUnit e teste de software
PHPUnit e teste de software
 
JS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com IonicJS Experience 2017 - Programação reativa com Ionic
JS Experience 2017 - Programação reativa com Ionic
 
Ionic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRxIonic Reativo com RxJS e ngRx
Ionic Reativo com RxJS e ngRx
 
Novidades do CSharp 4.0
Novidades do CSharp 4.0Novidades do CSharp 4.0
Novidades do CSharp 4.0
 
Evoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de ContratoEvoluindo Apps e Serviços com Testes de Contrato
Evoluindo Apps e Serviços com Testes de Contrato
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
TypeScript - Campus party 2013
TypeScript - Campus party 2013TypeScript - Campus party 2013
TypeScript - Campus party 2013
 
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
TechEd Brasil 2010 - Dicas, truques do Visual Studio 2010 e novas funcionalid...
 
Novidades do .Net 4.0
Novidades do .Net 4.0Novidades do .Net 4.0
Novidades do .Net 4.0
 
Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4Visual Studio 2010 e C# 4
Visual Studio 2010 e C# 4
 
TDC 2015 Florianopolis
TDC 2015 FlorianopolisTDC 2015 Florianopolis
TDC 2015 Florianopolis
 
Spring framework 2.5
Spring framework 2.5Spring framework 2.5
Spring framework 2.5
 

Mehr von Giovanni Bassi

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosGiovanni Bassi
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesGiovanni Bassi
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Giovanni Bassi
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8Giovanni Bassi
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployGiovanni Bassi
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresGiovanni Bassi
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2Giovanni Bassi
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e LinuxGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsGiovanni Bassi
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsGiovanni Bassi
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windowsGiovanni Bassi
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET CoreGiovanni Bassi
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com dockerGiovanni Bassi
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Giovanni Bassi
 

Mehr von Giovanni Bassi (20)

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviços
 
Sendo ágil com git
Sendo ágil com gitSendo ágil com git
Sendo ágil com git
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NET
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetes
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deploy
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineres
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.js
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
 
O Futuro do C#: C#8
O Futuro do C#: C#8O Futuro do C#: C#8
O Futuro do C#: C#8
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windows
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET Core
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com docker
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
 

C#4 COM Interop e Variância

  • 1. ASP.NET MVC – C#4 – COM Interop e Variância Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net
  • 2.
  • 5. .Net Architects: Grupo: http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
  • 6. Evento Palestras: Programando com prazer com DomainDriven Design (DDD) Utilizando Injeção de dependência com Unity (Enterprise Library) ASP.Net MVC: tome seu HTML de volta ORM - Sendo preguiçoso com Nhibernate Testes: garantindo que seu código faz o que você quer Data: 27/Junho Local: Unip Tatuapé - São Paulo/SP Valor: R$ 50 http://dotnetarchitects.net/dnad2009
  • 8. Ferramental C# 4.0 (Visual C# 2010) está presente no Visual Studio 2010 Beta 1 lançado em Maio Download do Beta tem apenas 1.3 GB, disponível em: http://tinyurl.com/vs10b1 Também no VS10: VB X F# DLR (suporte para IronRuby, IronPython, etc...)
  • 9. 4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
  • 10. 4 novidades Webcast da parte 1 Dia 04/6 Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM
  • 11. 4 novidades Construções dinâmicas Argumentos opcionais e argumentos nomeados Variância para tipos genéricos Melhorias na interoperabilidade com o COM Agora!
  • 13. COM Interop Não precisamos mais da palavra-chave ref(o compilador coloca sozinho) Não precisamos de cast de tipos de valor para object Com o suporte de parâmetros opcionais e nomeados, passamos só o necessário Igualzinho ao que há no VB.Net desde o .Net 1.0 e VB 7 (2002) Temos ainda opção de mesclar o assembly de interop
  • 14. COM Interop Como era antes? ApplicationClassWordApp = newApplicationClass();  WordApp.Visible = true;  objectmissing = System.Reflection.Missing.Value;  objectreadOnly = false;  objectfileName = "Documento.docx";  Word.Documentdoc= WordApp.Documents.Open( reffileName, refmissing, refreadOnly, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing, refmissing);
  • 15. COM Interop Como é no VB? DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True)
  • 16. COM Interop Como é agora? var WordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc = WordApp.Documents.Open( fileName, ReadOnly:false);
  • 17. COM Interop VB e C# lado a lado: var WordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc= WordApp.Documents.Open( fileName, ReadOnly:false); C# DimWordApp = New Word.ApplicationClass() WordApp.Visible = True DimfileName = "Documento.docx" DimdocAsDocument = _ WordApp.Documents.Open( _ fileName:=fileName, ReadOnly:=True) VB
  • 18. COM Interop O que é compilado: ApplicationWordApp = (Application) Activator.CreateInstance( Type.GetTypeFromCLSID(newGuid("000209FF-0000-0000-C000-000000000046"))); WordApp.Visible = true; stringfileName = "Documento.docx"; object <>r__ComRefCallLocal0 = fileName; object <>r__ComRefCallLocal1 = false; object <>r__ComRefCallLocal2 = Type.Missing; object <>r__ComRefCallLocal3 = Type.Missing; object <>r__ComRefCallLocal4 = Type.Missing; object <>r__ComRefCallLocal5 = Type.Missing; object <>r__ComRefCallLocal6 = Type.Missing; object <>r__ComRefCallLocal7 = Type.Missing; object <>r__ComRefCallLocal8 = Type.Missing; object <>r__ComRefCallLocal9 = Type.Missing; object <>r__ComRefCallLocala = Type.Missing; object <>r__ComRefCallLocalb = Type.Missing; object <>r__ComRefCallLocalc = Type.Missing; object <>r__ComRefCallLocald = Type.Missing; object <>r__ComRefCallLocale = Type.Missing; object <>r__ComRefCallLocalf = Type.Missing; objectaDoc = WordApp.Documents.Open( ref <>r__ComRefCallLocal0, ref <>r__ComRefCallLocal2, ref <>r__ComRefCallLocal1, ref <>r__ComRefCallLocal3, ref <>r__ComRefCallLocal4, ref <>r__ComRefCallLocal5, ref <>r__ComRefCallLocal6, ref <>r__ComRefCallLocal7, ref <>r__ComRefCallLocal8, ref <>r__ComRefCallLocal9, ref <>r__ComRefCallLocala, ref <>r__ComRefCallLocalb, ref <>r__ComRefCallLocalc, ref <>r__ComRefCallLocald, ref <>r__ComRefCallLocale, ref <>r__ComRefCallLocalf);
  • 19. COM Interop Mesclando o assembly de interop
  • 20. Demo Demo COM Interop
  • 23. Variância O que é variância? Define como ocorrem as conversões entre tipos Covariância Permite conversões do mais específico para o mais genérico Contravariância Permite conversões do mais genérico para o mais específico Invariância Permite conversões apenas para o mesmo tipo
  • 24. Variância Contravariância Covariância A flecha indica a conversão
  • 25. Variância Já temos covariância no C# 3: Em arrays: string[] textos = {}; object[] objetos = textos; De métodos para delegates (no retorno): staticstringRetornaString() {} Func<object> func = RetornaString;
  • 26. Variância Já temos contravariância no C# 3: De métodos para delegates (nos parâmetros): staticvoidRecebeUmObjeto(objectobj) { } Action<string> func3 = RecebeUmObjeto;
  • 27. Variância Mas não há variância entre tipos genéricos no C# 3 IList<string> textos = newList<string>(); IList<object> objetos = textos; Não compila no C# 3.0
  • 28. Variância Porque não? IList<string> textos = newList<string>(); IList<object> objetos = textos; objetos.Add(newButton()); Um botão não é uma string
  • 29. Variância Mas assim funciona... objetos[0] = newButton(); Perigo em tempo de execução Além do perigo, checagemem tempo de execução causa overhead
  • 32. Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado
  • 33. Variância Classe de genérico para específico Contravariante de específico para genérico Covariante Dado in out
  • 34. Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable {     IEnumerator<T> GetEnumerator(); }
  • 35. Variância Agora: Variância para tipos e delegates genéricos Covariante: publicinterfaceIEnumerable <out T> : IEnumerable {     IEnumerator<T> GetEnumerator(); } Se consigoenumerarmamíferos, consigoenumeraranimais
  • 36. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante): IEnumerable<string> textos = ObterEnumerador();  IEnumerable<object> objetos = textos;
  • 37. Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  } 
  • 38. Variância Agora: Variância para tipos e delegates genéricos Contravariante: publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  }  Se consigocompararanimais, consigocompararmamíferos
  • 39. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): IComparer<object> comparadorObjetos; IComparer<string> comparadorStrings = comparadorObjetos;
  • 40. Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
  • 41. Variância Agora: Variância para tipos e delegates genéricos Covariante e Contravariante: publicdelegate TResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
  • 42. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (covariante e contravariante):
  • 43. Variância Agora: Variância para tipos e delegates genéricos Exemplo de uso (contravariante): Func<Animal, Macaco> ConverteParaMacaco = animal => { varmacaco = animal asMacaco; if (macaco != null) returnmacaco; returnnull; }; Func<Mamifero, Mamifero> PassaUmMamiferoERetornaUmMamifero = ConverteParaMacaco;
  • 44. Variância Limitações Só tipos de referência (structs e tipos primitivos não são permitidos) Parâmetros out e ref são sempre invariantes Todos esses são inválidos: publicdelegatevoidAlgumDelegate<in T>(ref T valor);publicdelegatevoidAlgumDelegate<out T>(ref T valor); publicdelegatevoidAlgumDelegate<in T>(out T valor); publicdelegatevoidAlgumDelegate<out T>(out T valor);
  • 47. http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4 Resources) http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx (Eric Lippert - Microsoft)=> Traduzidopelo Felipe Fujiy: http://blog.fujiy.net/blog/category/Covariancia-e-Contravariancia.aspxhttp://unplugged.giggio.net/unplugged/?tag=/c%234 (Giovanni Bassi - MVP)http://renatoguimaraes.spaces.live.com (RenatoGuimarães – MVP)
  • 49.
  • 52. .Net Architects: Grupo: http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
  • 53. Obrigado Giovanni Bassi giggio@giggio.net blog: http://unplugged.giggio.net