Net-Base Revista

07.06.2026

C# e Delphi em uma arquitetura conjunta: integração pragmática em vez de 'ou isto ou aquilo'.

Muitas empresas mantêm aplicações desktop legadas Delphi e constroem em paralelo novos serviços e portais C#. O artigo mostra como C# e Delphi colaboram de forma limpa numa arquitectura comum: através de camadas bem definidas, interfaces estáveis, componentes comuns...

07.06.2026

Do tema da revista à prática do projeto

Páginas de serviços e técnicas correspondentes ao artigo

Em muitos departamentos de TI a situação de partida é semelhante: uma aplicação desktop Delphi estável e próxima aos processos sustenta fluxos críticos, enquanto novas exigências apontam para web, portais, uso móvel e integração com serviços em nuvem. Ao mesmo tempo, C# está estabelecido em muitas empresas quando se trata de services, Web-APIs e integração de identidade. A questão central, portanto, já não é “Delphi ou C#?”, mas: combinar C# e Delphi numa arquitetura comum de forma que operação, manutenção, armazenamento de dados e segurança permaneçam gerenciáveis.

Este artigo descreve princípios de arquitetura aplicáveis na prática, que se mostram eficazes em ambientes empresariais onde nem tudo pode ou deve ser reconstruído. O foco está em responsabilidades claras entre cliente desktop, serviços, dados e interfaces – e em como planear passos de modernização com baixo risco, sem pôr em perigo os processos em curso.

Por que pilhas tecnológicas mistas são comuns nas empresas

Soluções digitais empresariais maduras raramente surgem do zero. Aplicações Delphi foram frequentemente ampliadas ao longo de muitos anos, próximas aos processos do negócio, com lógica de dados extensa e profundo conhecimento dos casos especiais. Em paralelo surgiram novas exigências: portais de self-service, trocas de dados automatizadas, integração com DMS/CRM/ERP, multitenancy, maior auditabilidade ou Single Sign-on.

Neste contexto, C# frequentemente oferece vantagens em ecossistemas web e de serviços: amplo espectro de hosting, middleware padronizada, boa integração com Identity Provider e padrões estabelecidos para Web-APIs. Delphi, por outro lado, mantém-se forte quando se trata de clientes desktop Windows de alto desempenho, aplicações VCL mantidas a longo prazo ou clientes multiplataforma específicos (por exemplo via FMX).

Essa mistura, portanto, não é um “caso excepcional”, mas uma resposta realista à proteção de investimentos e à pressão por modernização. O ponto crucial é que a operação conjunta não se transforme numa obra permanente.

Princípio de arquitetura: camadas claras em vez de fronteiras por linguagem

Quando duas linguagens se encontram, a tentação é grande de organizar a separação ao longo da tecnologia (“Tudo Delphi é legado, tudo C# é novo”). Tecnicamente isso pode funcionar a curto prazo, mas a longo prazo gera atrito: regras de negócio duplicadas, responsabilidades pouco claras e erros difíceis de reproduzir.

Em vez disso, tem-se mostrado eficaz uma separação por domínio, frequentemente implementada como Layer-3 arquitetura: apresentação (UI), domínio (lógica de negócio) e infraestrutura (acesso a dados, sistemas externos). A questão não é tanto o modelo de livro didático, mas o efeito concreto no dia a dia: decisões sobre dados, validações e fluxos de trabalho são tomadas num único lugar e expostas por interfaces estáveis.

Numa arquitetura mista isso significa, na prática: Delphi pode continuar a fornecer uma parte da UI (ou fluxos de trabalho específicos), enquanto C# serviços encapsulam uma camada de domínio — ou vice‑versa. O importante é que a fronteira entre as camadas seja tecnicamente limpa e testável.

C# e Delphi numa arquitetura comum: três padrões de integração comprovados

Para a integração entre Delphi e C# não existe um único caminho «correto». Boas decisões orientam-se pela operação, requisitos de segurança, latência, volume de dados e ciclos de lançamento. Na prática, formaram-se três padrões.

1) Orientação a serviços sobre HTTP/REST como integração padrão

O mais robusto para operação e evolução é frequentemente uma integração via APIs REST (interfaces baseadas em HTTP). Clientes Delphi chamam serviços de C# ou de Delphi; portais de C# usam os mesmos endpoints. Esse desacoplamento torna os lançamentos mais previsíveis: uma atualização do cliente não é necessariamente necessária se a API mantiver compatibilidade retroativa.

Importa aqui uma implementação profissional: timeouts, retentativas, idempotência (requisições repetíveis sem efeitos colaterais), códigos de erro claros e uma estratégia de versionamento. Para administração e operação conta também: logs unificados, IDs de requisição rastreáveis e tempos de resposta bem mensuráveis.

2) Base de dados compartilhada: somente com regras claras

Um acesso compartilhado à base de dados por Delphi e C# parece atraente porque é rápido no início. A longo prazo, porém, é arriscado se ambos os mundos escreverem diretamente no mesmo conjunto de tabelas. O motivo: regras de negócio deslocam-se para triggers, stored procedures ou para „algures no cliente“. Isso dificulta a análise de erros e auditorias.

Se uma base de dados compartilhada for inevitável (p. ex. em fases de transição), regras claras ajudam:

  • Centralizar gravações: um sistema é „System of Record“ para determinadas entidades.
  • Definir contratos: views ou APIs como camada de leitura estável em vez de acessos diretos às tabelas.
  • Planear janelas de migração: aplicar alterações na base de dados sempre de forma retrocompatível (p. ex. novas colunas primeiro opcionais).

Tecnicamente, a base de dados passa então a ser um componente de infraestrutura, não o barramento de integração.

3) Messaging/Events para processos assíncronos

Para fluxos desacoplados (p. ex. importações, notificações, pós-processamento, jobs de interface) um modelo assíncrono é adequado: um sistema publica eventos, outro os processa. Isso reduz dependências diretas e estabiliza picos de carga.

Para a direção de TI e administradores é importante aqui: monitorização (comprimentos de filas), conceitos de dead-letter (mensagens falhadas), comportamento de retomada e idempotência funcional clara. Eventos não substituem uma gestão limpa de dados mestres, mas são uma boa ferramenta para cadeias de processo robustas.

Contratos de dados e compatibilidade: o núcleo subestimado

Independentemente do padrão de integração, a qualidade dos contratos de dados decide a estabilidade. Um contrato de dados é a descrição vinculativa de campos, tipos, obrigatório/opcional e semântica. Em APIs REST isso é tipicamente JSON; o importante não é «JSON em si», mas a disciplina no tratamento de alterações.

Regras comprovadas que simplificam significativamente a operação:

  • Estender em vez de quebrar: acrescentar campos novos, continuar a fornecer os antigos inicialmente.
  • Documentar a semântica dos campos: não apenas „string“, mas p. ex. formato de data ISO, fuso horário, estados permitidos.
  • Tratar valores enum com tolerância: os clientes devem sobreviver a valores desconhecidos (compatibilidade futura).
  • Usar versionamento de API de forma consciente: nem todo release precisa de uma nova versão; mas alterações incompatíveis devem ser claramente isoladas.

Estes pontos são especialmente importantes quando clientes desktop Delphi não podem ser atualizados tão frequentemente quanto serviços web.

Autenticação e autorização: um modelo de segurança comum

Arquiteturas mistas raramente falham por „tecnologia“, mais frequentemente por segurança inconsistente. Para as empresas importa: quem pode fazer o quê? Como é verificado? Como é auditado? Um modelo comum evita gestão de utilizadores duplicada e papéis contraditórios.

Na prática, isso conduz a uma camada de identidade centralizada: por exemplo através de SAML 2.0 (Single Sign-on federado, frequente em ambientes empresariais) ou OpenID Connect (baseado em OAuth2, frequentemente para APIs web modernas). C#-Services podem normalmente ser integrados diretamente a um Identity Provider; Delphi-Clients podem obter tokens e enviá‑los em chamadas de API. É importante que aplicações de desktop também não recebam „direitos especiais“ via acesso direto à base de dados.

Central para administradores:

  • Tempos de vida dos tokens e estratégia de refresh (para que os clients funcionem de forma estável e ainda assim segura)
  • Autenticação Service-to-Service para comunicação interna (p. ex. mTLS ou tokens assinados)
  • Least Privilege: não definir papéis e permissões de forma demasiado abrangente
  • Audit-Logs: registar de forma auditável ações relevantes para a segurança

Conceitos operacionais: Windows- und Linux-Services, IIS und Prozesse im Alltag

Uma arquitetura só é „boa“ na empresa se for operável: atualizações planeáveis, erros localizáveis, carga controlável. Em ambientes mistos, as variantes operacionais mais comuns são:

  • Windows- und Linux-Services: adequados para tarefas em segundo plano, execuções de interfaces, Worker; bem integráveis em modelos clássicos de operação de servidores Windows.
  • Windows- und Linux-Services/Daemon: apropriados para modelos de operação containerizados ou baseados em VM; frequentemente estáveis em operação contínua, boa automação via systemd.
  • Microsoft IIS: hospedagem consolidada para aplicações web e cenários de reverse-proxy em ambientes centrados em Windows.

É importante que componentes Delphi e C# cumpram padrões operacionais semelhantes: endpoints de health consistentes (sinais de vida), timeouts definidos, consumo de recursos limitado, bem como um procedimento claro de deployment e rollback. Isso reduz tratamentos „específicos por tecnologia“.

Logging, Tracing und Metriken: ein gemeinsames Observability-Niveau

Especialmente com dois stacks tecnológicos, cadeias de diagnóstico contínuas são decisivas. Um problema típico: o Delphi-Client reporta „Erro ao salvar“, o C#-Service tem um timeout, a base de dados reporta locks – sem correlação comum.

Na prática, recomendam-se:

  • IDs de correlação por request (Client → API → DB), para que os logs possam ser correlacionados.
  • Logging estruturado (chave/valor em vez de linhas de texto simples), para permitir filtragem posterior.
  • Métricas para latência, taxas de erro, comprimentos de fila e uso de recursos.
  • Classificação de erros: erros de negócio (validação) separados de erros técnicos (timeout, rede).

Esses fundamentos economizam, na prática, mais tempo do que qualquer discussão sobre „a linguagem certa“.

Acesso a dados e migração: BDE-substituição, FireDAC e bancos de dados modernos

Em Delphi-instalações o acesso a dados historicamente desempenha um papel importante. Onde ainda existem caminhos de acesso antigos como a Borland Database Engine (BDE), surge pressão adicional: atualizações do sistema operacional, migrações para 64 bits, disponibilidade de drivers, requisitos de segurança. Uma BDE-substituição deixa de ser apenas modernização e passa a ser redução de risco.

É típico a transição para uma BDE-substituição com integração nativa (camada de acesso a dados moderna em Delphi), combinada com um banco de dados que seja operacionalmente manejável (por exemplo PostgreSQL, SQL Server, MariaDB). Para uma arquitetura conjunta Delphi/C# são importantes dois aspetos:

  • Limites de transação: quem inicia/confirma transações, e como são regulados os acessos de escrita paralelos?
  • Estratégia de bloqueio e isolamento: para que workflows de desktop e serviços não se bloqueiem entre si.

Em migrações, um planejamento por fases mostra-se eficaz: primeiro modernizar a camada de drivers e de acesso, depois consolidar o modelo de dados e, em seguida, estabilizar as interfaces de integração. Assim as fontes de erro tornam-se isoláveis e reverter (rollback) torna-se realista.

Gestão de releases: conciliar ciclos de atualização distintos

Uma fonte recorrente de tensão é a frequência de atualizações: Web-Services podem ser implantados com mais frequência, clientes desktop muitas vezes com menos (janelas de rollout, comunicação com usuários, empacotamento). Uma arquitetura comum deve levar em conta essa assimetria.

Consequências práticas:

  • Compatibilidade regressiva da API é obrigatória, não opcional.
  • Feature Flags (chaves funcionais) ajudam a ativar novas funcionalidades no servidor de forma controlada.
  • Migrações de esquema devem ocorrer em fases: primeiro estender a base de dados, depois o serviço usar, e por fim atualizar o cliente.
  • Política clara de descontinuação: remover endpoints ou campos antigos apenas após um período definido.

Especialmente em ambientes regulados, é importante fixar essas regras por escrito como diretrizes arquiteturais, para que decisões não sejam reinventadas projeto a projeto.

Problemas típicos e como evitá-los de forma sistemática

Do ponto de vista operacional, os problemas mais frequentes em paisagens mistas Delphi/C# são bem previsíveis. Se forem abordados cedo, os custos de longo prazo caem sensivelmente.

Armadilha 1: lógica de negócio duplicada

Se o cliente Delphi e o serviço C# implementam as mesmas regras de forma diferente, surgem „erros fantasmas“: um processo funciona na UI, mas falha na importação pela API. Contramedida: centralizar regras na camada de domínio (serviço) ou atribuí‑las claramente por responsabilidade, incluindo respostas de validação inequívocas.

Armadilha 2: soluções paliativas na UI em vez de interfaces limpas

„Gravar rapidamente um campo no banco“ pode parecer inofensivo em casos isolados, mas gera interfaces paralelas sem registro (logging), autenticação e versionamento. Melhor: passar sempre por endpoints definidos, mesmo que isso exija mais disciplina inicialmente.

Armadilha 3: responsabilidades operacionais pouco claras

Se não estiver claro qual equipa é responsável por qual serviço, qual log e quais parâmetros de operação, a investigação de falhas acaba em ping-pong. Na prática, ajuda um mapa de serviços (qual serviço, quais dependências, quais portas, quais SLAs internos) e Runbooks uniformes para falhas frequentes.

Ponto crítico 4: inconsistência de segurança

Um portal com SSO, mas um cliente desktop com contas administrativas locais é um problema em muitas auditorias. Um modelo comum de identidade e de funções reduz risco e esforço de suporte.

Apoio à decisão: O que permanece em Delphi, o que vai para C#?

A divisão sensata depende menos da ideologia do que da proximidade aos processos e dos requisitos operacionais. Como orientação sob a perspetiva de arquitetura e operação:

  • Delphi é frequentemente adequado para: clientes desktop existentes Windows (VCL), fluxos de trabalho de UI muito responsivos, cenários próximos ao offline, manutenção a longo prazo de interfaces herdadas.
  • C# é frequentemente adequado para: APIs centrais REST, serviços de integração com ERP/DMS/CRM, componentes ligados à identidade, portais e processos de backend com alta frequência de alterações.
  • Decidir de forma consciente: a lógica de dados e validação não deve estar „no cliente“ quando existem vários frontends (desktop, portal, tarefas de importação).

Importante: O objetivo não é „tudo para C#“, mas uma arquitetura global robusta na qual os passos de modernização sejam planificáveis e os processos empresariais funcionem de forma estável.

Caminho de modernização: passo a passo da aplicação para o sistema

Na prática, uma arquitetura comum é frequentemente uma transição, mas longa. Um caminho de modernização realista evita grandes projetos com alto risco e aposta em objetivos intermédios mensuráveis:

  1. Estabilizar interfaces: introduzir a API REST como fronteira funcional, mesmo que internamente nem tudo esteja „bonito“.
  2. Modernizar o acesso a dados: BDE-substituição, drivers, capacidade 64 bits, transações claras.
  3. Centralizar identidade: SSO e modelo de funções para todas as vias de acesso.
  4. Unificar operação: Logging/Monitoring/Health, implantações claras, ambientes reproduzíveis.
  5. Desacoplar módulos funcionais: mover para serviços as partes com alta taxa de alterações, simplificar gradualmente a UI.

Esta ordem não é dogmática, mas tipicamente minimiza dependências: sem interfaces estáveis e um conceito de operação, qualquer alteração adicional torna-se mais cara.

Conclusão: Integração é uma tarefa de arquitetura, não uma questão de linguagens

Uma combinação sustentável entre Delphi e C# não surge através de bibliotecas-ponte, mas através de fronteiras funcionais claras, contratos de dados limpos e um conceito de operação que leve a sério a monitorização, a segurança e a gestão de releases. Quando C# e Delphi numa arquitetura comum colaboram conscientemente ao longo das responsabilidades, as empresas ganham sobretudo uma coisa: modernização sem ruptura de processos. Delphi pode continuar a suportar de forma fiável fluxos de trabalho desktop estáveis, enquanto os serviços C# fornecem integração, APIs web e portais como funções centrais da plataforma.

Se pretende modernizar passo a passo uma paisagem Delphi existente ou ligar de forma limpa serviços C#, uma revisão de arquitetura com foco em interfaces, dados, operação e segurança é o caminho mais rápido para decisões sólidas. Mais sobre o assunto em diálogo direto:

No âmbito funcional, a Delphi modernização e a REST-API para software legado desempenham um papel importante quando integrações, fluxos de dados e a evolução precisam funcionar de forma integrada.

Discutir projeto ou iniciativa de modernização com Net-Base.

Próximo passo

Quando um tema se torna um projeto real, arquitetura, sistemas existentes e operação devem ser considerados em conjunto desde o início.

Não apenas apoiamos questões pontuais, mas também quando fragmentos de código-fonte, temas legados ou ideias de portais precisam evoluir para um projeto empresarial robusto.

  • Estado atual, estado-alvo e riscos técnicos são avaliados em conjunto.
  • REST, o acesso a dados, os portais e o Rollout não são adiados para uma fase posterior.
  • Você vê cedo qual caminho é economicamente e operacionalmente viável.

Partilhar publicação

Compartilhar esta publicação diretamente

LinkedIn, X, XING, Facebook, WhatsApp e e‑mail estão imediatamente disponíveis. Para o Instagram, preparamos o link e um texto curto de imediato.

E-mail

O Instagram abre numa nova aba. O link e o texto curto são copiados previamente para a área de transferência.