ASP.NET MVC – C#4 – COM Interop e VariânciaGiovanni Bassigiggio@giggio.netblog: http://unplugged.giggio.net
Online @Email: giggio@giggio.net
Blog técnico: http://unplugged.giggio.net
Site: http://giovannibassi.com
.Net Architects: Grupo: http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
EventoPalestras:Programando com prazer com DomainDriven Design (DDD)Utilizando Injeção de dependência com Unity (Enterprise Library)ASP.Net MVC: tome seu HTML de voltaORM - Sendo preguiçoso com NhibernateTestes: garantindo que seu código faz o que você querData: 27/JunhoLocal: Unip Tatuapé - São Paulo/SPValor: R$ 50http://dotnetarchitects.net/dnad2009
Agenda
FerramentalC# 4.0 (Visual C# 2010) está presente no Visual Studio 2010 Beta 1 lançado em MaioDownload do Beta tem apenas 1.3 GB, disponível em:http://tinyurl.com/vs10b1Também no VS10:VB XF#DLR (suporte para IronRuby, IronPython, etc...)
4 novidadesConstruções dinâmicasArgumentos opcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COM
4 novidadesWebcast da parte 1Dia 04/6Construções dinâmicasArgumentos opcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COM
4 novidadesConstruções dinâmicasArgumentos opcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COMAgora!
COM Interop
COM InteropNão precisamos mais da palavra-chave ref(o compilador coloca sozinho)Não precisamos de cast de tipos de valor para objectCom o suporte de parâmetros opcionais e nomeados, passamos só o necessárioIgualzinho 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 InteropComo 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 InteropComo é no VB?DimWordApp = New Word.ApplicationClass()WordApp.Visible = TrueDimfileName = "Documento.docx"DimdocAsDocument = _WordApp.Documents.Open( _fileName:=fileName, ReadOnly:=True)
COM InteropComo é agora?var WordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc = WordApp.Documents.Open(fileName, ReadOnly:false);
COM InteropVB 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 = TrueDimfileName = "Documento.docx"DimdocAsDocument = _WordApp.Documents.Open( _fileName:=fileName, ReadOnly:=True)VB
COM InteropO 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 InteropMesclando o assembly de interop
DemoDemoCOM Interop
Dúvidasatéaqui?
Variância
VariânciaO que é variância?Define como ocorrem as conversões entre tiposCovariânciaPermite conversões do mais específico para o mais genéricoContravariânciaPermite conversões do mais genérico para o mais específicoInvariânciaPermite conversões apenas para o mesmo tipo
VariânciaContravariânciaCovariânciaA flecha indica a conversão
VariânciaJá 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ânciaJá temos contravariância no C# 3:De métodos para delegates (nos parâmetros):staticvoidRecebeUmObjeto(objectobj) { }		Action<string> func3 = RecebeUmObjeto;
VariânciaMas não há variância entre tipos genéricos no C# 3IList<string> textos = newList<string>();IList<object> objetos = textos;Não compila no C# 3.0
VariânciaPorque não?IList<string> textos = newList<string>();IList<object> objetos = textos;objetos.Add(newButton());Um botão não é uma string
VariânciaMas assim funciona...objetos[0] = newButton();Perigo em tempo de execuçãoAlém do perigo, checagememtempo de execuçãocausa overhead
Dúvidasatéaqui?
VariânciaClasseContravarianteCovarianteDado
VariânciaClassede genérico para específicoContravariantede específico para genéricoCovarianteDado
VariânciaClassede genérico para específicoContravariantede específico para genéricoCovarianteDadoinout
VariânciaAgora: Variância para tipos e delegates genéricosCovariante:publicinterfaceIEnumerable <out T>: IEnumerable{    IEnumerator<T> GetEnumerator();}
VariânciaAgora: Variância para tipos e delegates genéricosCovariante:publicinterfaceIEnumerable <out T>: IEnumerable{    IEnumerator<T> GetEnumerator();}Se consigoenumerarmamíferos, consigoenumeraranimais
VariânciaAgora: Variância para tipos e delegates genéricosExemplo de uso (covariante):IEnumerable<string> textos = ObterEnumerador();  IEnumerable<object> objetos = textos;
VariânciaAgora: Variância para tipos e delegates genéricosContravariante:publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  } 
VariânciaAgora: Variância para tipos e delegates genéricosContravariante:publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  }  Se consigocompararanimais, consigocompararmamíferos
VariânciaAgora: Variância para tipos e delegates genéricosExemplo de uso (contravariante):IComparer<object> comparadorObjetos;IComparer<string> comparadorStrings = comparadorObjetos;
VariânciaAgora: Variância para tipos e delegates genéricosCovariante e Contravariante:publicdelegateTResultFunc<in T1, in T2, outTResult>	(T1 arg1, T2 arg2);
VariânciaAgora: Variância para tipos e delegates genéricosCovariante e Contravariante:publicdelegateTResultFunc<in T1, in T2, outTResult>	(T1 arg1, T2 arg2);
VariânciaAgora: Variância para tipos e delegates genéricosExemplo de uso (covariante e contravariante):
VariânciaAgora: Variância para tipos e delegates genéricosExemplo de uso (contravariante):Func<Animal, Macaco> ConverteParaMacaco =    animal =>    {varmacaco = animal asMacaco;if (macaco != null)returnmacaco;returnnull;    };Func<Mamifero, Mamifero> PassaUmMamiferoERetornaUmMamifero = ConverteParaMacaco;
VariânciaLimitaçõesSó 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);
DemoDemoVariâ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)

C#4 - Parte 2 - COM interop e variância

  • 1.
    ASP.NET MVC –C#4 – COM Interop e VariânciaGiovanni Bassigiggio@giggio.netblog: http://unplugged.giggio.net
  • 2.
  • 3.
  • 4.
  • 5.
    .Net Architects: Grupo:http://dotnetarchitects.net Online: http://tinyurl.com/DotNetArch
  • 6.
    EventoPalestras:Programando com prazercom DomainDriven Design (DDD)Utilizando Injeção de dependência com Unity (Enterprise Library)ASP.Net MVC: tome seu HTML de voltaORM - Sendo preguiçoso com NhibernateTestes: garantindo que seu código faz o que você querData: 27/JunhoLocal: Unip Tatuapé - São Paulo/SPValor: R$ 50http://dotnetarchitects.net/dnad2009
  • 7.
  • 8.
    FerramentalC# 4.0 (VisualC# 2010) está presente no Visual Studio 2010 Beta 1 lançado em MaioDownload do Beta tem apenas 1.3 GB, disponível em:http://tinyurl.com/vs10b1Também no VS10:VB XF#DLR (suporte para IronRuby, IronPython, etc...)
  • 9.
    4 novidadesConstruções dinâmicasArgumentosopcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COM
  • 10.
    4 novidadesWebcast daparte 1Dia 04/6Construções dinâmicasArgumentos opcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COM
  • 11.
    4 novidadesConstruções dinâmicasArgumentosopcionais e argumentos nomeadosVariância para tipos genéricosMelhorias na interoperabilidade com o COMAgora!
  • 12.
  • 13.
    COM InteropNão precisamosmais da palavra-chave ref(o compilador coloca sozinho)Não precisamos de cast de tipos de valor para objectCom o suporte de parâmetros opcionais e nomeados, passamos só o necessárioIgualzinho 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 InteropComo eraantes?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 InteropComo éno VB?DimWordApp = New Word.ApplicationClass()WordApp.Visible = TrueDimfileName = "Documento.docx"DimdocAsDocument = _WordApp.Documents.Open( _fileName:=fileName, ReadOnly:=True)
  • 16.
    COM InteropComo éagora?var WordApp = newApplicationClass();  WordApp.Visible = true;  stringfileName = "Documento.docx";  vardoc = WordApp.Documents.Open(fileName, ReadOnly:false);
  • 17.
    COM InteropVB eC# 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 = TrueDimfileName = "Documento.docx"DimdocAsDocument = _WordApp.Documents.Open( _fileName:=fileName, ReadOnly:=True)VB
  • 18.
    COM InteropO 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 InteropMesclando oassembly de interop
  • 20.
  • 21.
  • 22.
  • 23.
    VariânciaO que évariância?Define como ocorrem as conversões entre tiposCovariânciaPermite conversões do mais específico para o mais genéricoContravariânciaPermite conversões do mais genérico para o mais específicoInvariânciaPermite conversões apenas para o mesmo tipo
  • 24.
  • 25.
    VariânciaJá temos covariânciano C# 3:Em arrays: string[] textos = {}; object[] objetos = textos;De métodos para delegates (no retorno):staticstringRetornaString() {}Func<object> func = RetornaString;
  • 26.
    VariânciaJá temos contravariânciano C# 3:De métodos para delegates (nos parâmetros):staticvoidRecebeUmObjeto(objectobj) { } Action<string> func3 = RecebeUmObjeto;
  • 27.
    VariânciaMas não hávariância entre tipos genéricos no C# 3IList<string> textos = newList<string>();IList<object> objetos = textos;Não compila no C# 3.0
  • 28.
    VariânciaPorque não?IList<string> textos= newList<string>();IList<object> objetos = textos;objetos.Add(newButton());Um botão não é uma string
  • 29.
    VariânciaMas assim funciona...objetos[0]= newButton();Perigo em tempo de execuçãoAlém do perigo, checagememtempo de execuçãocausa overhead
  • 30.
  • 31.
  • 32.
    VariânciaClassede genérico paraespecíficoContravariantede específico para genéricoCovarianteDado
  • 33.
    VariânciaClassede genérico paraespecíficoContravariantede específico para genéricoCovarianteDadoinout
  • 34.
    VariânciaAgora: Variância paratipos e delegates genéricosCovariante:publicinterfaceIEnumerable <out T>: IEnumerable{    IEnumerator<T> GetEnumerator();}
  • 35.
    VariânciaAgora: Variância paratipos e delegates genéricosCovariante:publicinterfaceIEnumerable <out T>: IEnumerable{    IEnumerator<T> GetEnumerator();}Se consigoenumerarmamíferos, consigoenumeraranimais
  • 36.
    VariânciaAgora: Variância paratipos e delegates genéricosExemplo de uso (covariante):IEnumerable<string> textos = ObterEnumerador();  IEnumerable<object> objetos = textos;
  • 37.
    VariânciaAgora: Variância paratipos e delegates genéricosContravariante:publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  } 
  • 38.
    VariânciaAgora: Variância paratipos e delegates genéricosContravariante:publicinterfaceIComparer<in T>  {      int Compare(T x, T y);  }  Se consigocompararanimais, consigocompararmamíferos
  • 39.
    VariânciaAgora: Variância paratipos e delegates genéricosExemplo de uso (contravariante):IComparer<object> comparadorObjetos;IComparer<string> comparadorStrings = comparadorObjetos;
  • 40.
    VariânciaAgora: Variância paratipos e delegates genéricosCovariante e Contravariante:publicdelegateTResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
  • 41.
    VariânciaAgora: Variância paratipos e delegates genéricosCovariante e Contravariante:publicdelegateTResultFunc<in T1, in T2, outTResult> (T1 arg1, T2 arg2);
  • 42.
    VariânciaAgora: Variância paratipos e delegates genéricosExemplo de uso (covariante e contravariante):
  • 43.
    VariânciaAgora: Variância paratipos e delegates genéricosExemplo de uso (contravariante):Func<Animal, Macaco> ConverteParaMacaco = animal => {varmacaco = animal asMacaco;if (macaco != null)returnmacaco;returnnull; };Func<Mamifero, Mamifero> PassaUmMamiferoERetornaUmMamifero = ConverteParaMacaco;
  • 44.
    VariânciaLimitaçõesSó tipos dereferê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);
  • 45.
  • 46.
  • 47.
    http://msdn.microsoft.com/en-us/vcsharp/dd819407.aspx (C# 4Resources) 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)