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

**URL:** <https://community.latromi.com.br/t/codigo-c-no-formulario-dinamico/405>\
**Category:** Tutoriais\
**Tags:** csharp, form\
**Created:** [Março 25, 2020, 8:01pm UTC](https://community.latromi.com.br/t/codigo-c-no-formulario-dinamico/405 "2020-03-25T20:01:53Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![daniel.giacomelli](https://community.latromi.com.br/user_avatar/community.latromi.com.br/daniel.giacomelli/32/1476_2.png) [@daniel.giacomelli](https://community.latromi.com.br/u/daniel.giacomelli)\
**Post date:** [Março 25, 2020, 8:01pm UTC](https://community.latromi.com.br/t/codigo-c-no-formulario-dinamico/405/1 "2020-03-25T20:01:53Z")

</div>

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:

```cs
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() 
      {
```

```cs
         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](https://docs.microsoft.com/pt-br/dotnet/framework/reflection-and-codedom/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_:

```cs
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.

 ![image](https://community.latromi.com.br/uploads/default/original/1X/76364c3a3813a7472826e991918eae1959ff4927.png)

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_:

```cs
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#_.

 ![image](https://community.latromi.com.br/uploads/default/original/1X/bf07e6e0903d943e248b445001cb67fa72dcd172.png)

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

```cs
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:

```cs
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.

```cs
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](https://docs.microsoft.com/pt-br/dotnet/standard/assembly/sign-strong-name). |
| 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:

```cs
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:

 ![image](https://community.latromi.com.br/uploads/default/original/1X/afa0c0cb03515a79e8013fcab10c72692bd6f9fc.png) .

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:

```cs
// 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.

---

<div class="post-metadata">

**Author:** ![Framos](https://community.latromi.com.br/user_avatar/community.latromi.com.br/framos/32/914_2.png) [@Framos](https://community.latromi.com.br/u/Framos)\
**Post date:** [Fevereiro 21, 2023, 2:24pm UTC](https://community.latromi.com.br/t/codigo-c-no-formulario-dinamico/405/2 "2023-02-21T14:24:00Z")

</div>

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