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 ).
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.
powered by IMHO 1.2 with Emoticon Formatter