sábado, 7 de dezembro de 2013

Como usar a mesma dll em uma aplicação windows forms e web forms

Recentemente me deparei com a seguinte situação em uma aplicação legada: tinha uma dll com as classes de negócio / aplicação, mas essas dlls faziam, de vez em quando, uso do namespace system.web. 

Meu desafio era utilizar estas classes em uma versão windows forms da aplicação, mas isso era impossível, uma vez que com a presença do namespace system.web a aplicação não compilava, e não era permitido a adição da minha dll. 

Você pode estar pensando, e eu também pensei, que o problema se resolveria facilmente adicionando uma referência à dll system.web.dll, mas se fosse só isso o problema estaria resolvido.

O que realmente me causou esse problema era o fato de que quando você cria novas aplicações windows forms ou console, por padrão o visual studio 2010 usa a versão "client profile" do .net framework, uma versão mais magra que não tem toda aquela parafernalha server. No entanto, minha aplicação fazia muito uso de HttpContext.Current.Session.Add, dentro de system.web.dll, que é justamente uma parafernalha server. 
Consegui resolver esse prodblema trocando o framework para o framework "comum", com isso pude adicionar minha dll e a aplicação até compilava, o que não quer dizer que funcionava. 

Vá em project --> properties e na aba application, mude o target  framework de .net framework 4 client profile para .net framework 4, simplesmente.

Vá em project --> properties e na aba application, veja o target framework

Mude o target framework para .net framework 4


Corrigi o problema na aplicação legada separando em classes que implementam uma mesma interface as partes que usam e que não usam HttpContext, e usei o framework de injeção de dependência/ IoC Unity para instanciar a classe correta dependendo da aplicação ser web ou windows. Mas também dá para resolver sem isso, usando a dll legada mesmo.

Fiz 4 exemplos de minhas possíveis soluções usando workarounds:
Usando portable class library
Usando o class library comum
Usando diretivas de compilação (preprocessor directives)
meu preferido: usando reflection

para ver o meu post no msdn americano

Nenhum comentário:

Postar um comentário

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)