Utilizzare assembly sparsi nel filesystem

Problema: il nostro codice utilizza un assembly che non risiede nè nella directory dell'eseguibile nè in una sua sottodirectory (Infatti se di sottodirectory si trattasse sarebbe sufficiente utilizzare il metodo System.AppDomain.CurrentDomain.AppendPrivatePath).

Soluzione: utilizzare un file di configurazione.

Aggiungiamo un file di configurazione al nostro progetto. Per automatizzare la build aggiungiamo la seguente direttiva post-build alle proprietà di progetto:

copy app.config "$(TargetPath).config"

(Chissà perchè vs non lo fa da se)

Nel file config aggiungiamo quindi la sezione necessaria per linkare gli assembly:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <runtime>
    <assemblyBinding 
xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity 
name="AssemblyName" 
                         
culture="neutral" 
                         
publicKeyToken="ab9f21381c07889c" />
        <codeBase 
version="1.0.0.0" 
                  
href="FILE://c:/Programmi/myAssembly/AssemblyName.dll" />
      <
/dependentAssembly>        
    <
/assemblyBinding>
  <
/runtime>        
<
/configuration>

Come si vede è necessario indicare anche la publicKeyToken. Per estrarla possiamo fare uso dell'utility sn con il parametro -T.

Ok... questo è tutto nel caso in cui l'assembly lo referenziamo regolarmente, se invece l'assembly lo carichiamo con un Assembly.Load senza fornire il nome completo dell'assembly (senza versione, chiave e cultura)?
In questo caso dobbiamo fare uso di un ulteriore nodo (qualifyAssembly) nel file config sempre sotto assemblyBinding:

<qualifyAssembly partialName="AssemblyName" 
fullName="AssemblyName,version=1.0.0.0,publicKeyToken=ab9f21381c07889c,culture=neutral" /
>

Ovviamente l'ideale è che la posizione della dll venga modificata all'interno del file config in fase di installazione del software. Per fare questo si potrà aggiungere al progetto una Installer class, farne l'override del metodo install ed in quella sezione modificare il file config trattandolo semplicemente come un xml. Infine nel progetto di setup non dobbiamo dimenticare di aggiungere la nostra Installer class alle Custom Action (ma questa è un'altra storia Smile che strizza l'occhio ).

Riferimenti:
How to load an assembly at runtime that is located in a folder that is not the bin folder of the application
Redirecting an Application to Target a Different XML Web Service During Installation

Ovviamente, come sempre, sono benvenuti commenti, suggerimenti, etc. Smile a bocca aperta

powered by IMHO 1.2 with Emoticon Formatter

Print | posted on lunedì 21 marzo 2005 10:13

Copyright © Gabriele Gaggi

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski