V10 RecursosReferencia
RecursosReferencia
Referencia
Años | List of Articles

¿Cómo utilizar Assembly Resolver en proyectos de integración?

Última modificación el 03/05/2024

La forma más sencilla de utilizar la API de las aplicaciones PRIMAVERA es utilizar Visual Studio .NET, en el lenguaje de desarrollo que más le convenga.

La forma correcta de desarrollar es referenciando las assemblies distribuidas con el ERP PRIMAVERA desde la carpeta “APL”.  Durante esta tarea, se recomienda poner la propiedad “Copy Local" igual a false, evitando así que durante el "build" del proyecto, todas las assemblies referenciadas, así como sus dependencias, sean copiadas en la carpeta de output. Esto provocaría, en última instancia, la existencia de versiones diferentes de las assemblies PRIMAVERA en la máquina en la que está instalada la aplicación integradora.

Para solucionar este problema y para que, en la mayoría de las actualizaciones del ERP, no sea necesario intervenir sobre la aplicación integradora, es importante desarrollarla de forma que utilice siempre las assemblies disponibles en la carpeta "APL", actualizados y compatibles con el ERP. Para lograr este comportamiento, es necesario que tengan un método "resolver" que se encarga de la carga de las assemblies. Para que esto ocurra, basta con que al inicio de la aplicación se añada un "handler" para el evento "AssemblyResolve" existente para el dominio de la aplicación. En la ejecución, cuando la assembly requerida no existe en la carpeta de la aplicación, el nombre de la "assembly" es transferido a este método, y su carga puede ser manejada desde el lugar y la manera más conveniente.

C#

///
/// Módulo de exemplo de carregamento de Interops da pasta APL.
///
static class Program 
{
	///
	/// The main entry point for the application.
	///
	[/av_hread]
	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 = “PRIMAVERASG100Apl”;

		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
Bookmark or share this article
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!