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.