none
Como importar uma classe customizada em um plugin RRS feed

  • Pergunta

  • Boa noite pessoal.

    Estou com uma dúvida, acredito que não seja algo muito dificil de se fazer, porém não consegui achar o caminho certo.

    Criei uma classe customizada com alguns métodos e tentei chamar essa classe dentro dos meus Plugins, porém, na hora de executar o plugin

    pelo Dynamics, recebo uma mensagem do tipo: "Não foi possível abrir o arquivo ou assembly...... ou uma de suas dependências não pode ser localizada."

    Eu adicionei a referência do arquivo .dll no meu Plugin e utilizei o using, embora consiga utilizar os métodos da classe, em tempo de execução essa mensagem é lançada para mim. O que estou fazendo errado?

    Obrigado


    Christian Adans
    sexta-feira, 25 de março de 2011 21:48

Respostas

Todas as Respostas

  • Chrstian,

     

    Essa mensagem é muito genérica. Normalmente é algum problema na parte de registro do plugin.

     

    Depois da modificação você registrou novamente o plugin do zero?

     

    Abs,

     


    Ricardo Alves
    www.ricardoalves.me
    domingo, 27 de março de 2011 00:34
  • Obrigado por responder Ricardo.

    Depois de criar a classe customizada eu a compilei e ai entao criei um novo plugin e utilizei a referencia desta classe, utilizando seus métodos.

    Entao registrei o plugin no evento update da entidade Contact, e quando faço o teste este erro é lançado.

    Desconfiei que seria por causa da classe customizada, pois nela existe uma referência da Web apontando para o Dynamics. E como diz na mensagem: "Não foi possível abrir o arquivo ou assembly... ou uma de suas dependências não pode ser localizada..", será que poderia ser esta referência ao WS do Dynamics?

     

     


    Christian Adans

    terça-feira, 29 de março de 2011 02:26
  • Se a unica referencia for o WS, acho que não deveria ter problema.

     

    Pelo o que eu entendi você apenas chama um método dessa classe no Execute do plugin, correto?

    Você assinou o assembly (strong name key)?

    Você testou a classe antes de adiciona-lá ao plugin?

     

    Abs,

     

     


    Ricardo Alves
    www.ricardoalves.me
    terça-feira, 29 de março de 2011 09:49
  • É a única referência que estou utilizando.

    Por via das dúvidas criei uma nova classe de teste:

    using System;
    
    
    
    using Classes.Dynamics; //fiz referencia ao WS do Dynamics para teste
    
    
    
    
    
    
    
     public class ClassOne
    
    
    
     {
    
    
    
     public string Mensagem()
    
    
    
     {
    
    
    
      var text = "Hello World";
    
    
    
    
    
    
    
      return text;
    
    
    
     }
    
    
    
     }
    
    
    
    

     

    Logo após, assinei este assembly com o strong name key e compilei.

    Em seguida criei uma nova biblioteca de classes, assinei o assembly com o strong name key:

    using System;
    
    
    
    using Microsoft.Crm.Sdk;
    
    
    
    using Classes; //Referencia a classe customizada
    
    
    
    
    
    
    
    
    
    
    
    namespace UpdateContact{
    
    
    
     public class UpdateContact : IPlugin
    
    
    
     {
    
    
    
     public void Execute(IPluginExecutionContext context)
    
    
    
     {
    
    
    
      ClassOne classe = new ClassOne();
    
    
    
    
    
    
    
      throw new InvalidPluginExecutionException(classe.Mensagem()); 
    
    
    
     }
    
    
    
     }
    
    
    
    }
    
    
    
    

    Logo após isso, compilei e registrei este assembly no evento Update da entidade Contact.

    Fiz o teste novamente, mas deu o mesmo erro.

    Tentei retirar a referência ao WS do Dynamics e mesmo assim, deu o mesmo erro.


    Christian Adans

    terça-feira, 29 de março de 2011 12:15
  • Não esqueça que deve levar as dll's customizadas para o bin do CRM... Devido a execução dentro do contexto CRM!
    terça-feira, 29 de março de 2011 13:11
    Moderador
  • Christian,

     

    Tente fazer o mesmo teste, mas sem a referência para o WS...

     

    Abs,

     


    Ricardo Alves
    www.ricardoalves.me
    terça-feira, 29 de março de 2011 18:06
  • Ricardo, já fiz este teste, porém deu o mesmo erro.
    Christian Adans
    quarta-feira, 30 de março de 2011 13:54
  • Thiago,

    Quais dll's eu devo levar para dentro da pasta bin do CRM?


    Christian Adans
    quarta-feira, 30 de março de 2011 13:54
  • Eu levo todas, pro existirem interdependência! Estando no bin do CRM todas estarão "ativas" e "conhecidas" no momento da execução dos plugins!

     

    Att,

    Tiago Cardoso

    quarta-feira, 30 de março de 2011 14:45
    Moderador
  • Entendi.

    Vou fazer o teste colocando os assembly's dentro da pasta Bin e qualquer novidade postarei aqui.

    Obrigado


    Christian Adans
    quarta-feira, 30 de março de 2011 15:48
  • Thiago, fiz o teste.

    Coloquei a dll do plugin e da classe customizada dentro da pasta Microsoft Dynamics CRM\Server\bin e não funcionou.

    Depois tentei colocando na pasta Microsoft Dynamics CRM\Server\bin\assembly, porém deu o mesmo erro.


    Christian Adans
    quinta-feira, 31 de março de 2011 16:47
  • Não, era para colocar em Microsoft Dynamics CRM\CRMWeb\bin
    quinta-feira, 31 de março de 2011 18:36
    Moderador
  • Thiago, esta pasta não existe no server.

    A única que eu achei foi InetPub\WWWRoot\bin.

     

    As pastas que existem dentro da pasta Microsoft Dynamics CRM são:

    - pt-br

    - Reports

    - Server

    - Setup

    - Tools

    - Trace


    Christian Adans



    quinta-feira, 31 de março de 2011 20:48
  • Cristian,

     

    Deve estar oculta coisas do gênero, pois é impossível do CRM estar funcionando sem existir a pasta CRMWeb.


    sexta-feira, 1 de abril de 2011 12:25
    Moderador
  • Obrigado, já consegui resolver.

    Para fazer isso foi mais complexo do que pensava. Precisei utilizar a ferramenta ILMERGE para unir assemblies.

    Utilizei as referências abaixo para resolver o meu problema:

    Como utilizar classes e métodos de um assembly em um plugin:

    http://crm.georged.id.au/post/2008/02/22/Packaging-plugins.aspx

    Como assinar um assembly com nomes fortes:

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

    Como gerar arquivos snk(Strong Name Key):

    http://support.microsoft.com/kb/302340

     


    Christian Adans

    • Marcado como Resposta Klibor sexta-feira, 1 de abril de 2011 13:45
    sexta-feira, 1 de abril de 2011 13:45
  • Hiii, não vai dar certo não! Tenta depurar (através de attach) essa dll's pra você ver... Não funciona quando você faz um merge! Por isso eu disse para jogar as dll's no bin...
    sexta-feira, 1 de abril de 2011 14:12
    Moderador
  • Eu não uso depurador, não conheço essa opção "attach".

    Testando direto pelo Dynamics, funcionou perfeitamente. Agora consigo utilizar os métodos da classe customizada através do plugin.

    Eu não consegui localizar esta pasta no servidor, marquei a opção para "mostrar pastas e arquivos ocultos", mas mesmo assim não achei.

     

     

     


    Christian Adans

    sexta-feira, 1 de abril de 2011 15:54
  • Caramba e como você olha onde deu um erro no plugin? Precisar "attchar" o processo w3wp e ficar debugando...

     

    A pasta tem que existir e algum lugar, pois sem ela não teria como abrir o CRM, pois dentro desta pasta existem todas as dll's do produto bem como as páginas...

    sexta-feira, 1 de abril de 2011 19:38
    Moderador
  • Atualmente só pelo try e catch rsrs..

    Na verdade eu ainda estou aprendendo, não sabia que dava pra fazer isso.

    Você pode me ensinar como fazer isso?


    Christian Adans
    segunda-feira, 4 de abril de 2011 11:38
  • segunda-feira, 4 de abril de 2011 11:44
    Moderador
  • Olá Christian,

     

    Não é necessário você utilizar o ILMERGE. Se você está tendo problema com a referência para as dlls do SDK, é só você registrá-las no GAC do servidor.

     

    Abs,

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves sexta-feira, 8 de abril de 2011 10:01
    sexta-feira, 8 de abril de 2011 09:55
  • Mais uma dica, 

     

    As dlls utilizadas nos plugins, registrados em DISK, devem ficar no diretório Dynamics CRM\Server\bin\assembly.

     

    Abs,

     


    Ricardo Alves
    www.ricardoalves.me
    • Marcado como Resposta RicardoAlves sexta-feira, 8 de abril de 2011 10:01
    sexta-feira, 8 de abril de 2011 10:00