Blog Stats
  • Posts - 16
  • Articles - 0
  • Comments - 123
  • Trackbacks - 31

 

giovedì 13 settembre 2007

Caricamento assemblies da percorsi alternativi

Sto sviluppando un’applicazione che è una estensione di un’applicativo , il tutto in managed c++. Per caricare i miei assemblies di varie funzioni specializzate, avevo usato la strada della GAC e quella della modifica application.exe.config.

Soluzione1 non bella, perchè queste dll non erano poi cosi’ tanto generalpurpose e poi mi potevano interferire con altre installazioni.

Soluzione 2 non bella perchè andavo a modificare dei file proprietari dell’applicativo, ad un suo re-install venivano perse le mie modifiche.  Ho trovato in rete la soluzione 3, la riassumo J  

Nella fase di caricamento : prendo il dominio corrente dell’applicazione e metto un gestore dell’evento di errore nel caricamento degli assemblies:

AppDomain^ currentDomain = AppDomain::CurrentDomain;

currentDomain->AssemblyResolve +=

          gcnew System::ResolveEventHandler( &miaclasse::MyResolveEventHandler);

 

e poi lo gestisco, andando a prendere l’assembly proprio nella mia dir:

 

System::Reflection::Assembly ^ miaclasse::MyResolveEventHandler(Object^ sender, ResolveEventArgs^ args)

{      //------ qui prendo il mio percorso di installazione dei miei componenti  

//e lo metto in String^ path -------

 

//nome dell’assembly da caricare

       String^ strTempAssmbPath=args->Name->Substring(0,args->Name->IndexOf(","))+".dll";

 

//percorso completo

       String^ fullPath = System::IO::Path::Combine(path, strTempAssmbPath);

      

//carico il tutto e lo ritorno !

       Assembly^ MyAssembly = Assembly::LoadFrom(fullPath);

       return MyAssembly;        

 

 }

 

Funziona!

 

 

Copyright © Bruna Gavioli