Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

23
versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

Transcript of Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

Page 1: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Tecgraf PUC-RioNovembro de 2013

Mapeamento de IDL para C#

Page 2: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de interface

• O IIOP.NET não implementa o padrão CORBA completamente e conta com algumas diferenças, mas é compatível com outros ORBs

• Em C#, uma interface IDL é mapeada para uma interface com o mesmo nome da interface IDL e é usada como o tipo referenciado pelos usuários

• A implementação de um servant deve implementar essa interface e estender a classe abstrata MarshalByRefObject

• A classe MarshalByRefObject é o mapeamento de uma referência remota em C#, e é utilizada pelo IIOP.NET para representar objetos CORBA

Page 3: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de interface

• Atributos definidos na interface são mapeados para um par de métodos get e set (Properties)

• Atributos readonly são mapeados apenas para métodos get (Properties)

• Parâmetros in são mapeados para parâmetros conforme o tipo correspondente

• Parâmetros out são mapeados para parâmetros out do tipo correspondente

• Parâmetros inout são mapeados para parâmetros ref do tipo correspondente

Page 4: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de interface

// C#public interface CadastroPessoa : IIdlEntity { string empresa { get; set; } void incluiPessoa(Pessoa p); void alteraPessoa(ref Pessoa p);}

// IDLmodule exemplo { struct Pessoa { string nome; long idade; }; interface CadastroPessoa { attribute string empresa; void incluiPessoa (in Pessoa p); void alteraPessoa (inout Pessoa p); };};

Page 5: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento dos tipos primitivos

Page 6: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento dos tipos primitivos

• Observações– Tipos unsigned em IDL são mapeados para tipos

signed em CLS– Não existe representação para fixed nem long double

Page 7: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de struct

• Um struct IDL é mapeado para um struct C# que possui uma variável para cada campo

• A classe possui o mesmo nome do struct IDL

Page 8: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de struct

// C#public struct StructType : IIdlEntity { // instance variables public int field1; public string field2; // constructors public StructType(int f1, String f2){ field1 = f1; field2 = f2; }}

// IDLstruct StructType { long field1; string field2;};

Page 9: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de sequence

• Um sequence IDL é mapeado para um array CLS uni-dimensional com o mesmo nome

Page 10: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de array

• Ainda não há mapeamento para arrays no IIOP.NET

Page 11: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de typedef

• O IIOP.NET não possui uma construção para typedef

• O tipo original é usado

Page 12: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de enum

• O enum IDL é mapeado para um enum CLS com o mesmo nome

• O tipo Int32 é usado para representar cada valor da enumeração

Page 13: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de enum

// C#enum TrafficLight {red, yellow, green};

// IDLenum TrafficLight { red, yellow, green};

Page 14: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de union

• O union IDL é mapeado para uma classe com o mesmo nome, que possui os métodos:• de acesso ao valor determinante • de acesso e modificação para cada possível

valor das opções definidas no tipo e para o valor default

Page 15: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de valuetype

• O valuetype IDL é mapeado para uma classe abstrata com o mesmo nome• É responsabilidade do desenvolvedor criar

a classe que implenta essa classe abstrata, garantindo a correta recomposição do estado do objeto no processo de unmarshal

• O IIOP.NET convenciona que a classe com a implementação do valuetype deve ter o mesmo nome, seguido do sufixo Impl

• Além disso, deve ser marcada como serializable e ter um construtor sem parâmetros

Page 16: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de valuetype

// C#[ImplClass("exemplo.NodeImpl")][RepositoryID("IDL:exemplo/Node:1.0")][Serializable]public abstract class Node : IIdlEntity { public int id; public Node _next;}

// IDLvaluetype Node { public long id; public Node next;};

Page 17: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de valuetype

• O desenvolvedor deve criar a classe que implementa a classe abstrata gerada a partir do valuetype

[Serializable]public class NodeImpl : Node { public NodeImpl() { }}

Page 18: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de valuetype

• Quando entregar somente implementações de ValueTypes em uma DLL, caso o programa não referencie nenhum tipo da DLL, a mesma não será carregada

• Lembre-se então de carregá-la com Assembly.Load(“<nome-da-dll>”)

Page 19: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de ANY

• O tipo any usado na IDL é mapeado para a classe C# System.Object– Quando um método receber um any, pode-se

passar qualquer objeto e o IIOP.NET se encarregará da conversão

– Quando um any for recebido, basta ser convertido para o tipo esperado

• Alternativamente pode-se utilizar a opção –mapAnyToCont para o compilador de IDL, e assim o tipo IDL any passará a ser convertido em um container org.omg.CORBA.Any

Page 20: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de ANY

// C#OrbServices orb = OrbServices.GetSingleton();int arg2 = 89;omg.org.CORBA.TypeCode ulongTC = orb.create_ulong_tc();Any any = new Any(arg2, ulongTC);int result2 = m_testService.ExtractFromULongAny(any);

// IDLCORBA::ULong ExtractFromULongAny(const CORBA::Any& arg);

• Exemplo onde é necessário enviar um unsigned long em um any

• Utiliza-se o container org.omg.CORBA.Any para forçar o marshaller a usar o tipo diferente, já que o int C# é signed

Page 21: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Mapeamento de ANY

// C#OrbServices orb = OrbServices.GetSingleton();TypeCode wstringTC = orb.create_wstring_tc(0);Any any = new Any("myString", wstringTC);myObject.Test(any);

• A FAQ do IIOP.NET menciona um problema do JacORB (não especifica qual versão) para receber Any’s com typecode 30 (valor de tipo encapsulado)

• Isso geralmente ocorre quando uma string .NET é convertida em um Any.

• O código acima mostra como evitar esse problema

Page 22: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Módulos

• Um módulo IDL é mapeado para um namespace C# com o mesmo nome

// IDL module tecgraf {

module openbus {

module DRMAA {...}

// namespace C#

namespace tecgraf.openbus.DRMAA {}

Page 23: Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Mapeamento de IDL para C#

versão 1 - julho/2013

Conflitos de nomes

• Em geral, os nomes usados na IDL são mapeados diretamente para os mesmos nomes em C#

• Conflitos de nomes no mapeamento são resolvidos usando um prefixo _ no nome em C#