V10 RecursosReferência
RecursosReferência
Referência
Voltar | Lista de artigos

Como utilizar a Assembly Resolver nos projetos de integração?

Última alteração a 28/09/2021

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
Adicionar aos favoritos ou partilhar este artigo
Esta página foi útil?
Obrigado pelo seu voto.

login para deixar a sua opinião.

Obrigado pelo seu feedback. Iremos analisá-lo para continuarmos a melhorar!
Artigos Relacionados
Características das entidades e serviços Conceito de integração Conceito de extensibilidade Como registar projetos de extensibilidade? Boas práticas de organização de projetos de integração