• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

pedrotuga

As minhas dúvidas sobre o mono

54 mensagens neste tópico

Ora viva.

Quero fazer um addin para uma aplicação mono que usa a framework de addins do mono, mas não estou aperceber bem o que é o mono no fim de contas ou o que permite fazer.

O problema em concreto é este: no meu caso um plugin é feito extendendo uma classe base e implementado pelo menos trés métodos com nomes pré-definidos.

Estou a falar deste caso em particular:

http://live.gnome.org/Tomboy/HowToCreateAddins

O que me faz confusão é que não estou a entender onde é que a .net framework entra no meio disto tudo. Tipo... supostamente existe suporte para javascript ou python por exemplo. A questão é: é possível extender a classe base (escrita em C#) noutra linguagem?

É que se for eu não estava com grandes complicações e pegava já tipo em javascript para fazer isto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok.. ninguem me respondeu a isto :P

Mas tambem já está resolvido, vou usar csharp de qualquer das formas.

Umas perguntas mesmo basicas:

-O mono concerteza deve ter um classpath, ou qq coisa equivalente, onde é que o posso consultar/editar?

-Ao usar um assembly (acho que é o nome dos pacotes no mono) basta-me fazer o import como se faz por exemplo em python ou tenho que definir a linkagem quando compilo?

-a pasta onde os sources estão é uma localização pertencente ao classpath (ou equivalente)?

-Ainda não percebi porque é que há dois compiladores, o gmcs e o mcs? qual é o oficial mantido pelo projecto, quem mantem o outro? quais as diferenças?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

-O mono concerteza deve ter um classpath, ou qq coisa equivalente, onde é que o posso consultar/editar?

-Ao usar um assembly (acho que é o nome dos pacotes no mono) basta-me fazer o import como se faz por exemplo em python ou tenho que definir a linkagem quando compilo?

-a pasta onde os sources estão é uma localização pertencente ao classpath (ou equivalente)?

Em .NET que eu saiba não existe o conceito de classpath. Mas tens referências, que funcionam como uma biblioteca dinâmica (aliás, a extensão é mesmo .DLL). Se usares um IDE como o Visual Studio, ou o MonoDevelop, podes facilmente editar as referências e ele passa os comandos ao compilador, senão tens de fazer à pata.

http://mono-project.com/Need_Help#Can_not_compile_my_source

-Ainda não percebi porque é que há dois compiladores, o gmcs e o mcs? qual é o oficial mantido pelo projecto, quem mantem o outro? quais as diferenças?

http://www.mono-project.com/CSharp_Compiler

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aqui vai uma dúvida de noob completo.

Por exemplo, neste código:

using CookComputing.XmlRpc;

public struct SumAndDiffValue 
{
  public int sum; 
  public int difference; 
}

[XmlRpcUrl("http://www.cookcomputing.com/sumAndDiff.rem")] 
public interface ISumAndDiff : IXmlRpcProxy
{ 
  [XmlRpcMethod] 
  SumAndDiffValue SumAndDifference(int x, int y);
} 

O que são aquelas coisas entre parentesis rectos?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

as coisas entre parentesis recctos são Atributos....

os atributos permitem-te adicionar metainformação ao codigo existe num programa. essa metainformação é tipicamente extraida utilizando reflection.

Assim sendo podes utilizar estes por exemplo que eu conheço

[Conditional("DEBUG")] - so é compilado se estiveres em modo debug

ou por exemplo

[Obsolete] - Dispara um warning para avisar que esse methodo ja esta obsoleto

[DllImport("some.dll")] - para importares um dll especifica

[WebMethod] para dizeres que um determinado metodo é usado como webservice

etc...

Para mais info procura informação sobre attributes e .NET no google...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este tópico passou-me completamente ao lado :), embora tarde, cá vai.

Quero fazer um addin para uma aplicação mono que usa a framework de addins do mono, mas não estou aperceber bem o que é o mono no fim de contas ou o que permite fazer.

Mono é uma plataforma, uma implementação livre de um standard que é também implementado pelo que chamas .net. Tanto o mono como o .net implementam o mesmo standard, sendo que a Micrososft acrescentou extensões próprias à sua implementação, e por isso, muitas vezes ao referirmos .net referimos mais do que o standard já que as tecnologias misturam-se bastante. Mono por sua vez, implementa o standard e tenta oferecer uma implementação de algumas das tecnologias que a Microsoft acrescentou, como sejam ASP.net, Windows Forms, Silverlight, etc.

O que me faz confusão é que não estou a entender onde é que a .net framework entra no meio disto tudo. Tipo... supostamente existe suporte para javascript ou python por exemplo. A questão é: é possível extender a classe base (escrita em C#) noutra linguagem?

É que se for eu não estava com grandes complicações e pegava já tipo em javascript para fazer isto.

Possível, em teoria é, o standard define um bytecode para o qual as linguagens usadas podem ser compiladas, esse bytecode é sempre igual, seja qual for a linguagem, isto é, se programares em C, C++, C#, VB ou J# em .net o resultado é que os programas são convertidos de forma igual, ou similar a nível de instruções, para o bytecode definido pelo standard. Resumindo, em .net/mono a escolha da linguagem é uma questão puramente de sintaxe já que no fundo aquilo é tudo bytecode por trás. Por isso podes usar bibliotecas feitas em C# no teu projecto VB, ou feitas em VB no teu projecto C++.

Aliás, isso acontece até nas bibliotecas de intereop da Miscrosoft, usadas para criar aplicações que façam uso do pacote MS Office, em que as mesmas bibliotecas que tens no sistema, são usadas por qualquer projecto, seja qual for a linguagem. Não existe uma implementação por linguagem mas sim uma implementação comum que pode ser usada por qualquer projecto.

A única questão é que tem de existir um compilador que transforme a tua linguagem no bytecode de forma correcta, com o Visual Studio a Microsoft envia alguns compiladores base, como para C#, VB, J#, C++, etc. Em mono isso não acontece, pelo que tenho visto em repositórios Ubuntu e Debian, os pacotes de instalação base nem o compilador de C# trazem, pelo que podes correr aplicações mas não podes criar aplicações. Que eu conheça, apenas existem compiladores na plataforma mono para as linguagens de C# e Java, mais que isso não tenho a certeza.

O mono concerteza deve ter um classpath, ou qq coisa equivalente, onde é que o posso consultar/editar?

Não há classpath mas existe o global assembly cache, que de uma forma simplista é a pasta que contém todas as assemblies globais do teu sistema. Tipicamente é configurada pelo IDE ou pelas ferramentas de administração que acompanham o SDK, no caso do .net, no caso do mono não sei precisar se vêm com as dependências de desenvolvimento ou não.

-Ao usar um assembly (acho que é o nome dos pacotes no mono) basta-me fazer o import como se faz por exemplo em python ou tenho que definir a linkagem quando compilo?

Se a assembly estiver acessível ao compilador/IDE só tens de adicionar a instrução "using", um import típico.

-a pasta onde os sources estão é uma localização pertencente ao classpath (ou equivalente)?

Não, as sources estão onde quiseres, desde que o IDE saiba onde é :). Que eu conheça, não existe qualquer restrição ao local onde as tuas sources estão, afinal, código fonte é útil apenas a ti e visível ao compilador apenas quando se compila.

-Ainda não percebi porque é que há dois compiladores, o gmcs e o mcs? qual é o oficial mantido pelo projecto, quem mantem o outro? quais as diferenças?

A plataforma Mono é mantida apenas por uma entidade, a Novell, com a colaboração de vários programadores, mas é um projecto para o qual a Novel dispõe de programadores em tempo inteiro, pagos e patrocinados por eles. Os compiladores existentes para C# são os oficiais e as diferenças centram-se nas versões que suportam e nas funcionalidades que oferecem, como deve estar indicado no link que te deram. Outros compiladores existentes podem ser obra de outros programadores, qualquer pessoa pode criar um compilador para incluir uma linguagem ainda não suportada pela plataforma.

O que são aquelas coisas entre parentesis rectos?

Como já te disseram são atributos, em Java são conhecidos como anotações, e representam dados sobre o código, informações para o compilador ou para outras ferramentas usarem. Tipicamente notificam o compilador de algumas características do código, mas dado que não passam de classes e que podem ser estendidas, podes ter aplicações que, com reflexão, conseguem fazer muitas outras tarefas, como gerar código automaticamente, criar bases de dados e preencher com tabelas, etc. É algo que, por exemplo o Hibernate, usa para gerir os objectos, os seus atributos e métodos.

Esses que tens no exemplo definem um webservice ou métodos RPC se quiserem assim chamar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, então tenho este assembly chamado CookComputing.XmlRpc.dll

é escrever using CookComputing.XmlRpc; e estou feliz ou tenho que linkar isto aquando da compilação, como?

Tenho usado o gmcs.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

using é uma palavra que tem um objectivo similar ao import em Java, precisarás de a indicar para indicares classes em namespaces diferentes dos das tuas classes, tal como packages em Java, embora namespaces não se traduzam para localizações físicas.

E tal como em Java, para adicionares bibliotecas com classes que queres usar tens de o indicar durante a compilação/execução, podes fazer isso nas opções do IDE, se usares o MonoDevelop, ou quando estiveres a compilar, como o primeiro link que o Triton te indicou :)

http://mono-project.com/Need_Help#Can_not_compile_my_source

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

 gmcs teste.cs -r:CookComputing.XmlRpcV2.dll teste.cs(1,21): error CS0234: The type or namespace name `XmlRpcV2' does not exist in the namespace `CookComputing'. Are you missing an assembly reference?
teste.cs(1,1): error CS0246: The type or namespace name `CookComputing.XmlRpcV2' could not be found. Are you missing a using directive or an assembly reference?
Compilation failed: 2 error(s), 0 warnings

Ok... como é que configuro as pastas onde posso por o meu assembly?

Ou como é que digo ao compilador que o assembly está na mesma pasta que o source?

Já me estou a passar com a falta de documentação desta porra.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

De certeza que estás a linkar o .dll com o teu programa? É que parece que o erro vem dai, mas como estás a usar um editor que desconheço, não sei se será outro tipo de problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

De certeza que estás a linkar o .dll com o teu programa? É que parece que o erro vem dai, mas como estás a usar um editor que desconheço, não sei se será outro tipo de problema.

Não faço ideia. O que significa 'linkar' em concreto?

Eu compilei assim:

gmcs teste.cs -r:CookComputing.XmlRpcV2.dll

e pus isto no meu código:

CookComputing.XmlRpcV2;

e meti o dll na mesma pasta que o source.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como eu disse, não conheço esse IDE nem sei como se usa mas o problema talvez seja esse... Enquanto que tu fazes "using disto" ou "using daquilo" isso apenas não chega se o respectivo .dll não estiver referenciado na aplicação, nem que o .dll esteja na pasta do programa. Tens de dizer ao programa para usar aquele .dll.

Deve ser o que o Triton disse...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como eu disse, não conheço esse IDE nem sei como se usa mas o problema talvez seja esse... Enquanto que tu fazes "using disto" ou "using daquilo" isso apenas não chega se o respectivo .dll não estiver referenciado na aplicação, nem que o .dll esteja na pasta do programa. Tens de dizer ao programa para usar aquele .dll.

Neste caso ele nem está a usar nenhum IDE, e como ninguém em .NET faz compilações de linha de comandos, isto tem pouca documentação. pedrotuga, aconselho-te a usar o MonoDevelop 2.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Neste caso ele nem está a usar nenhum IDE, e como ninguém em .NET faz compilações de linha de comandos, isto tem pouca documentação. pedrotuga, aconselho-te a usar o MonoDevelop 2.

Eu tenho o monodevelop mas não estou a ver em que é que isso vai mudar o que quer que seja neste caso. Como é que se adiciona um assembly no monodevelop?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tal como em Visual Studio, no teu "Solution Explorer", se não mudaste nada é o painel que está activo por omissão na lateral esquerda, para cada projecto tens um conjunto de pasta pré-definidas, uma deles, logo a primeira, será a "References", botão direito em cima dessa pasta > "Edit References...".

A janela que te aparece possuirá 3 separadores no topo, um para cada categoria de assembly que podes adicionar, globais, provenientes de outros projectos, ou bibliotecas que possuas em disco e que não estejam instaladas. Estas últimas são as que tipicamente provêm de projectos .net e devem ser as que pretendes.

É só escolher o ficheiro e adicionar ao projecto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem pessoal, já consigo  compilar isto tanto com o monodevelop como manualmente usando o gmcs. A documentação do assmebly de XMLRPC que estou a usar não era bem clara em relação às instruções de import que afinal de contas estavam erradas.

Isto já está a funcionar, já aqui ando a testar pedidos em XMLRPC e está tudo nos conformes.

Brevemente aparecerei com mais uma carrada de dúvidas.

Obrigado pelas ajudas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora aqui está mais uma.

Estava eu aqui todo contente a ler umas defenições classes que vou ter que extender, quando me deparei com a keyword 'get' por aqui e por ali assim atirada para o meio do código.

Fui perguntar ao google e aparentemente parece que o C# usa a keyword 'get' para definir um método getter.

http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx

Alguem me explica qual é a grande vantagem disto em relação a definir manualmente um  método? É que não se poupa código nenhum.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é para definir propriedades em C#. Não precisas de aceder aos atributos privados da classe com funções (getters/setters). Podes aceder como se fosse um atributo público. E também poupas código se utilizadores propriedades implementadas automaticamente.

using System;

public class Entity
{
    public int ID { get; set; }
    public string Name { get; set; }
}

public class EntityManager
{
    static void Main()
    {
        Entity entity = new Entity ();

        entity.ID = 1;
        entity.Name = "tiracio";
    }
}

Se quiseres também podes tu próprio definir o método set e get.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi. Se não tivesses colocado { get; set; } as instruções de atribuição na classe EntityManager não seriam válidas?

Tambem não percebi qual é a vantagem de criar atributos privados quando lhe podemos aceder normalmente, por que não criar publicos nesse caso.

Anyway, no teu código os atributos que tens são publicos, pelo que estou bastante confuso :s

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi. Se não tivesses colocado { get; set; } as instruções de atribuição na classe EntityManager não seriam válidas?

Tambem não percebi qual é a vantagem de criar atributos privados quando lhe podemos aceder normalmente, por que não criar publicos nesse caso.

Seriam válidas, mas repara que não podias controlar os acessos. Não podias por exemplo ter um atributo público que não fosse posível alterar. Com getters/setters podes fazer o que quiseres.

using System;

public class Entity
{
    private int m_id;

    public int ID {
        get { return m_id; }
        set { m_id = value;  }
    }
}

public class EntityManager
{
    static void Main()
    {
        Entity entity = new Entity();

        entity.ID = 1;
    }
}

Este pequeno exemplo mostra o encapsulamento que as propriedades permitem obter. Podias alterar o tipo de dados do ID que o código que usa a classe continua a funcionar (com o código dos getters/setters devidamente corrigido, obviamente).

Anyway, no teu código os atributos que tens são publicos, pelo que estou bastante confuso :s

Isso faz-te confusão porque estás habituado a ver código em Java/C++ provavelmente. Nessas linguagens não podes controlar o acesso aos atributos públicos, então a solução é criar atributos privados, que supostamente são internos à classe (logo não deveriam poder ser acedidos por código exterior) e utilizar getters/setters. Em C# como podes ter propriedades, que é uma forma de controlar o acesso aos atributos públicos, isso não é necessário.

Repara também que no primeiro exemplo que te dei, as propriedades foram implementadas automaticamente, ou seja, não foi necessário criar uma variável privada e implementar o getter/setter (o caso mais comum). Mas as vantagens das propriedades é que mais tarde podes sempre alterar isto sem que o código que usa a classe tenha de ser modificado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não percebi. Se não tivesses colocado { get; set; } as instruções de atribuição na classe EntityManager não seriam válidas?

Não tem a ver com serem válidas ou não.

Tambem não percebi qual é a vantagem de criar atributos privados quando lhe podemos aceder normalmente, por que não criar publicos nesse caso.

É neste ponto que entra a noção de propriedade. Se definires métodos get/set para um atributo estás a criar uma propriedade, e ao acederes a essa propriedade, usando a mesma notação que usas em atributos públicos, o que é realmente chamado são os métodos get/set, consoante o caso especifico.

Pegando no exemplo do Triton,

using System;

public class Entity
{
   private int ID { get; set; }
   private string Name { get; set; }
}

public class EntityManager
{
   static void Main()
   {
       Entity entity = new Entity ();

       entity.ID = 1; //ACESSO À PROPRIEDADE. NÃO É ACESSO DIRECTO AO ATRIBUTO.
       entity.Name = "tiracio"; //ACESSO À PROPRIEDADE. NÃO É ACESSO DIRECTO AO ATRIBUTO.
   }
}

O que acontece é que ao fazer a atribuição, a plataforma irá invocar o método set correspondente.

Anyway, no teu código os atributos que tens são publicos, pelo que estou bastante confuso :s

Se são públicos não há qualquer vantagem, mas existem algumas funcionalidades da plataforma que são dependentes da existência de propriedades.

O conceito de propriedades é algo que pode ser estranho, na verdade uma propriedade é apenas um atributo para o qual foram criados métodos de acesso get/set. A partir desse momento, esses atributos passam a ser tratados de forma diferente pela plataforma e por algumas ferramentas, como é o caso de editores visuais que mostram as propriedades mas não os atributos públicos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que vou ao site de documentação da microsoft ler um pouco sobre propriedades. Não me levem a mal, não há nada de errado nas vossas explicações, simplesmente isto parece-me apenas uma buzzword e ainda não consegui vislumbrar uma situação prática onde isto signifique uma vantagem real tipo poupança de código, flexibilidade, ou outra.

Talvez com alguma prática perceba a grande ideia por detrás disto.

Para já, obrigado pelos esclarecimentos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu quando aprendi Java o ano passado o meu prof sempre disse para fazermos as coisas assim:

class ClassName {
private int varName;

public int getVarName();
public int setVarName();
}

E eu, como já programava em C#, fiquei esptando por saber que em Java não se tinha propriedades como em C#:

class ClassName {
private int varName;

public int VarName {
	get { return varName; }
	set { varName = value; }
}
}

E neste exemplo, até poderia usar as propriedades automáticas como o Triton já falou, onde poupas bastante código, só fiz directamente para se perceber melhor onde quer chegar. Na minha opinião, fica muito melhor e podes separar melhor vários tipos de código. Tens propriedades onde no fundo são atributos mas podes aplicar-lhes qualquer lógica de programação no get/set se assim o entenderes. Enquanto que em Java tens de misturar isto no meio de outros métodos. Prefiro a forma do C#. Imagina uma classe com dezenas de atributos, vais ter de criar x2 dezenas de métodos, misturando com os métodos da classe. Isto é só mais uma razão, já te foram dadas outras.

Uma outra particularidade é que podes fazer coisas assim:

class ClassName {
private int varName;

public int VarName {
	get { return varName; }
	private set { varName = value; }
}
}

Ou seja, só podes ler o valor desta propriedade, modificar, só dentro da classe. Ou até podes mesmo omitir por completo o set, ficando com uma propriedade read-only.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que vou ao site de documentação da microsoft ler um pouco sobre propriedades. Não me levem a mal, não há nada de errado nas vossas explicações, simplesmente isto parece-me apenas uma buzzword e ainda não consegui vislumbrar uma situação prática onde isto signifique uma vantagem real tipo poupança de código, flexibilidade, ou outra.

Pessoalmente acho que é algo que depende muito da forma de programares, não costumo usar propriedades a não ser que seja obrigado, por exemplo por estar a usar uma tecnologia que depende das propriedades para funcionar, ou melhor, uso as propriedades no mesmo sentido em que uso os métodos de acesso get/set que uso em Java. Mas isto foi porque o meu percurso passou primeiro pelo Java.

Na prática a única vantagem que posso ver é o facto de ter uma sintaxe mais curta, como o Triton mostrou no exemplo, podes, sem indicar o nome completo, apenas colocando get/set, criar métodos de acesso a variáveis privadas e criando assim propriedades. Em Java terás de criar métodos mais verbosos dado que não existe noção de propriedades como em C#, mas na prática quer as propriedades de C#, quer os métodos de acesso get/set comuns em Java são a mesma coisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora