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

 

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!


Feedback

# re: Caricamento assemblies da percorsi alternativi

Gravatar Anzichè gestire un eccezione (che comunque viene generata e quindi causa "rallentamenti") io utilizzerei un file di configurazione con la direttiva assemblyBinding es.:

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="nomeAssembly" />
<codeBase href="FILE://c:/../posizionedelladll.dll" />
</dependentAssembly>
...

In questo modo il binding corretto avviene in maniera completamente trasparente.
13/09/2007 06:40 | Gabriele Gaggi

# Levitra.

Gravatar Levitra experience. 29/05/2009 06:18 | Levitra.

Comments have been closed on this topic.
 

 

Copyright © Bruna Gavioli