Como utilizar a Assembly Resolver nos projetos de integração?
A forma mais simples de utilizar a API das aplicações PRIMAVERA é através do recurso ao Visual Studio .NET, na linguagem de desenvolvimento que lhe seja mais conveniente. A forma correta de desenvolvimento é referenciando as assemblies distribuídas com o ERP PRIMAVERA a partir da pasta “APL”. Durante esta tarefa, é recomendado colocar a propriedade “Copy Local” igual a false, evitando assim que durante o “build” do projeto sejam copiadas, para a pasta de output, todas as assemblies referenciadas, bem como as suas dependências. Tal levaria, no limite, à existência de versões diferentes das assemblies PRIMAVERA na máquina onde está instalada a aplicação integradora. Para resolver o problema e para que, em grande parte das atualizações do ERP, não seja necessário efetuar qualquer intervenção sobre a aplicação integradora, é importante desenvolver a mesma de forma a que esta utilize sempre os assemblies disponíveis na pasta “APL”, atualizados e compatíveis com o ERP. Para obter este comportamento, é necessário que estas tenham um método “resolver” que trate do carregamento das assemblies. Para que isto ocorra, basta que logo no início da aplicação seja adicionado um “handler” para o evento “AssemblyResolve” existente para o domínio da aplicação. Na execução, quando a assembly necessária não existe na pasta da aplicação, é transferido para este método o nome da “assembly”, podendo o seu carregamento ser tratado a partir do local e da forma mais convenientes.C#
///
/// Módulo de exemplo de carregamento de Interops da pasta APL.
///
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
//Este handler tem que ser adicionado antes de existir qualquer referência para classes existentes.
//isto é, no método Main() da aplicação NÃO PODERÁ EXISTIR DECLARAÇÕES DE VARIÁVEIS DE TIPOS EXISTENTES NAS Assemblies.
//Com este método, na pasta da aplicação não deverão existir as assemblies e as referências para os mesmos deverão ser
//adicionadas com Copy Local = False e Specific Version = false.
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
//executar o método de teste
DoTest();
}
///
/// Método para resolução das assemblies.
///
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string assemblyFullName;
System.Reflection.AssemblyName assemblyName;
const string PRIMAVERA_FOLDER = “PRIMAVERA\\ SG100\\ Apl”;
assemblyName = new System.Reflection.AssemblyName(args.Name);
assemblyFullName = System.IO.Path.Combine(System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), PRIMAVERA_FOLDER), assemblyName.Name + “.dll”);
if (System.IO.File.Exists(assemblyFullName))
return System.Reflection.Assembly.LoadFile(assemblyFullName);
else
return null;
}
}
VB.NET
'
' Módulo de exemplo de carregamento de Interops da pasta APL.
' Para este exemplo são necessárias referências para os Interops.
'
Module Program
'Inicio da aplicação.
Sub Main()
'Este handler tem que ser adicionado antes de existir qualquer referência para classes existentes.
'isto é, no método Main() da aplicação NÃO PODERÁ EXISTIR DECLARAÇÕES DE VARIÁVEIS DE TIPOS EXISTENTES NAS Assemblies.
'Com este método, na pasta da aplicação não deverão existir os Interops e as referências para os mesmos deverão ser
'adicionadas com Copy Local = False e Specific Version = false.
AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CurrentDomain_AssemblyResolve
'Chamar o método de teste
DoTest()
End Sub
'Método para resolução das assemblies.
Public Function CurrentDomain_AssemblyResolve(sender As Object, args As ResolveEventArgs) As System.Reflection.Assembly
Dim assemblyFullName As String
Dim assemblyName As System.Reflection.AssemblyName
Const PRIMAVERA_FOLDER As String = “PRIMAVERA\SG100\Apl”;
assemblyName = New System.Reflection.AssemblyName(args.Name)
assemblyFullName = System.IO.Path.Combine(System.IO.Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), PRIMAVERA_FOLDER), assemblyName.Name + “.dll”)
If (System.IO.File.Exists(assemblyFullName)) Then
Return System.Reflection.Assembly.LoadFile(assemblyFullName)
Else
Return Nothing
End If
End Function
End Module
login para deixar a sua opinião.