Código C# no Formulário Dinâmico

Nos Formulários Dinâmicos, é possível executar códigos C# personalizados, e com isso executar qualquer operação que esteja além das funcionalidades nativas do Latromi.

Estrutura do Código C#

Para escrever o código C# que será usando no Formulário, pense que você está escrevendo um código dentro de um método já existente. Você não deve escrever a declaração de classe ou do método.

Por exemplo, o Código abaixo preenche o DateTimePicker dtpData com a data atual do Servidor:

var dataAtual = DateTime.Now;       
Fields["dtpData"].Value = dataAtual.ToString("yyyy-MM-dd");

Quando o Formulário for salvo, o Código C# será compilado no seguinte formato:

namespace LATROMI.DynamicLib.FRM00000023300002420200325150218460305
{
   using System;
   using System.Collections.Generic;
   using System.Linq;
   using System.Text;
   using System.Xml.Linq;

   public class Main: FormExecutionContext
   {
      public void MB0F75A9069B74E85A89C302F03090A06() 
      {
         var dataAtual = DateTime.Now;       
         Fields["dtpData"].Value = dataAtual.ToString("yyyy-MM-dd");
      }
   }
}

Composição do Código:

  • Classe Base: Classe abstrata FormExecutionContext, herdada em todos os códigos.
  • Namespace: É formado pelo Código de Atualização do Formulário, precedido do literal fixo LATROMI.DynamicLib.
  • Nome do método: Código gerado internamente pelo Latromi para cada código C# adicionado.

Assemblies Referenciados

Veja abaixo a lista padrão das DLLs referenciadas em todos os assemblies compilados.

  • System.dll
  • System.Core.dll
  • System.Xml.dll
  • System.Xml.Linq.dll
  • System.Data.dll
  • Microsoft.CSharp.dll

Se você precisar usar uma DLL diferente, será necessário chamá-la via Reflection ou usando o método LoadAssembly (instruções mais abaixo), que está declarado na classe base FormExecutionContext.

Declaração using

Por padrão, todos os códigos C# terão a lista de “using” abaixo:

  • System
  • System.Collections.Generic
  • System.Linq
  • System.Text
  • System.Xml.Linq

Você pode inserir outras declarações “using” no começo do código, desde que o namespace esteja nas DLLs referenciadas por padrão no assembly (veja no item acima).

Abaixo um exemplo de como adicionar uma declaração “using” para o namespace System.Text.RegularExpressions:

using System.Text.RegularExpressions;

var placa = Fields["txtPlaca"].Value.ToString();
if (!Regex.IsMatch(placa, "^[A-Z]{3}[0-9][0-9A-Z][0-9]{2}$"))
{
   throw new InvalidOperationException($"Placa '{placa}' inválida.");
}

Incluindo o Código C#

O código C# pode ser incluído no Formulário de Duas Formas:

Ação - Popular Campos e Variáveis

Se você precisa utilizar um Código C# simples, para preencher um campo ou variável, você pode usar a ação Popular Campos e Variáveis, e no editor de valores, clicar no botão com o ícone do C#.
Usando essa opção, o código informado obrigatoriamente precisa ter um retorno.

Abaixo um exemplo de como poderíamos preencher o TextBox txtResult com o clássico texto “Hello World!” usando a ação Popular Campos e Variáveis:

return "Hello World!";

Ação - Executar Comando C#

Se precisa executar um código C# mais complexo, que vai além de simplesmente preencher um campo, você deve usar a ação Executar Comando C#. Utilizando essa ação, você pode escrever um Código C# como se estivesse dentro de um método void.
Para adicionar o código, abra o menu de Ações, e vá até a opção Executar Comando C#.

Abaixo um exemplo de como poderíamos reproduzir o mesmo efeito do exemplo anterior, mas usando a ação Executar Comando C#:

Fields["txtResult"].Value = "Hello World!";

Carregando DLLs

Use o método LoadAssembly para carregar outras DLLs ao projeto.

Para referenciar uma DLL que faz parte do .NET Framework, você pode simplesmente informar o nome da DLL sem o caminho, pois o sistema vai procurar na pasta do Framework que estiver em execução.

Por exemplo, para obter a referência do assembly System.Runtime.Serialization.Json.dll, que faz parte do .NET Framework, bastaria usar o código abaixo:

System.Reflection.Assembly serializationJsonAssembly = 
         LoadAssembly(@"System.Runtime.Serialization.Json.dll");

Para obter a referência de um assembly que não faz parte do .NET Framework, basta usar o mesmo código, informando o caminho completo da DLL.

System.Reflection.Assembly assembly = 
         LoadAssembly(@"C:\Latromi\Assemblies\LATROMI.CSharpSamples.dll");

Desenvolvendo uma DLL para usar no Latromi

Veja abaixo quais cuidados você deve tomar no momento de desenvolver uma DLL que será chamada dentro do LATROMI:

.NET Framework Utilize a versão 4.5.2 ou inferior.
Nome Forte Assine o assembly com um Nome Forte.
Versionamento Tenha o hábito de sempre incrementar a versão da DLL a cada nova compilação.
Caminho A DLL precisa estar disponível no mesmo caminho nas maquinas onde o Client e Site estão sendo executados. Crie uma cópia do arquivo para cada computador e coloque no mesmo caminho de pasta.

Agora vamos ao código! Vamos criar uma DLL com o clássico exemplo “Hello World!”:

Usando o Visual Studio, criaremos um projeto do tipo Class Library chamado LATROMI.CSharpSamples.

A classe abaixo será a única classe do projeto:

using System;
using System.Text;

namespace LATROMI.CSharpSamples
{
    public class HelloWorld
    {
        public string GetText() => "Hello World!";
    }
}

E a DLL será assinada com um nome forte:

.

Após a compilação, temos o arquivo LATROMI.CSharpSamples.dll, o qual foi colocado na pasta C:\Latromi\Assemblies.

Veja abaixo como ficara a chamada da DLL no Latromi. Neste exemplo, o método GetText está sendo chamado para obter o texto “Hello World!” e usa-lo para preencher o campo txtResult:

// Obtém a referência do Assembly
var assembly = LoadAssembly(@"C:\Latromi\Assemblies\LATROMI.CSharpSamples.dll");

// Cria uma instância da classe HelloWorld
dynamic helloWorld = Activator.CreateInstance(
					assembly.GetType("LATROMI.CSharpSamples.HelloWorld"));

// Preenche o campo txtResult					
Fields["txtResult"].Value = helloWorld.GetText();

Use o tipo dynamic ao invés de var ou object para receber a instância obtida dinamicamente. Dessa forma, é possível acessar diretamente os membros da classe ao invés de usar Reflection para acessar cada método ou propriedade.

2 curtidas

Obrigado, esse tutorial ajudou muito.
Consegui criar uma dll e utilizar em um dos meus projetos. :facepunch:

2 curtidas