2010-03-15 9 views
27

Sto usando EmguCV per un progetto e quando il nostro programma viene eseguito ha bisogno di alcune DLL come "cxcore.dll" ecc. (O genera eccezioni di runtime). Al momento, ho inserito i file nella cartella principale della cartella di output (selezionato "Copia sempre" nelle proprietà del file in Visual Studio).C# Mettendo le DLL richieste da qualche altra parte rispetto alla radice dell'output

Tuttavia sembra un po 'disordinato, avere circa 10 diverse DLL proprio lì. C'è qualche modo in cui posso spostarlo in una sottocartella nella cartella di output e lo troverà comunque.

+0

Si desidera fare riferimento ad essi da un'altra posizione (ad esempio, essere inclusi con tutte le altre librerie dipendenti) o farli dire in una sottocartella sotto la directory bin? Inoltre, questi sono ** inclusi ** nel progetto o sono ** caricati ** (Assembly.Load o P/Invocato) dalla tua app? – GrayWizardx

+0

@Gray: voglio metterli in una sottocartella sotto la mia directory bin. Io non uso queste dll direttamente, ma sono usate dal progetto EmguCV (credo che siano P/Invocato). Inoltre, penso che le DLL stesse siano state scritte in C. Se le DLL sono assenti posso ancora creare, ma otterrei un'eccezione di runtime. – Aishwar

risposta

-2

È possibile copiare le DLL nel punto desiderato utilizzando gli eventi di creazione pre/post e i macro che indicano dove si trova la cartella di output.

Tuttavia, se le DLL non si trovano nella stessa directory dell'eseguibile, non verranno caricate. Se sono gestiti, è possibile caricarli manualmente utilizzando i metodi Assembly.Load. Se non sono gestiti, non so come si possa fare.

+1

attenti agli eventi di pre/post build, specialmente in ambienti in cui si lavora con più sviluppatori e/o build automatizzati. Possono essere grandi trucchi. – GrayWizardx

-3

Puoi tenerlo altrove e collegarlo ancora. Nelle proprietà di riferimento, impostare "Copia locale" su falso e impostare il percorso di conseguenza. Questo funzionerà. Se le DLL esterne sono supposte di cambiare versione, è possibile impostare "Versione specifica" su Falso per poter collegare a qualsiasi versione.

55

Sorprendenti risposte finora. Nessuna ragione;) Bene,

sì, è possibile inserire gli assembly in posizioni separate.

Nel corrispondente di configurazione dell'applicazione (app.config che viene copiato your.exe.config) aggiungere:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="lib" /> 
    </assemblyBinding> 
    </runtime> 

Secondo:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

Questo renderà il programma guardare nel percorso privato (cartelle sotto la propria cartella) per gli assembly - proprio come un'applicazione web cerca/bin.

È inoltre possibile inserirli nel GAC, ma ciò dovrebbe essere evitato a meno che non vi siano altri motivi.

Ciò detto, davvero non è necessario. Gli utenti non si confondono se si installa l'applicazione correttamente nel menu di avvio;) Non ho mai avuto questo problema, compresi i progetti con più di 50 assembly. Gli utenti non li vedono mai.

+0

@TomTom Risposta svish giusta –

+0

Per quanto riguarda la risposta. Sei sicuro che funzionerà con le librerie non gestite? –

+0

@TomTom: quanto sopra sarebbe nel mio file '.csproj'? Il mio progetto è un'applicazione Win # C: non riesco a trovare un file '.config'. – Aishwar

17

Per ottenere gli assembly in una sottodirectory, è possibile copiarli manualmente, utilizzare un evento pre o post-build o qualcosa di completamente diverso.

Per caricarli, è possibile utilizzare AppDomain.AssemblyResolve Event o (come indicato da TomTom) il <probing> Element. Da MSDN:

L'esempio seguente mostra come specificare le sottodirectory di base dell'applicazione che il runtime deve cercare per gli assembly.

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Il GAC è naturalmente un altro posto per scaricare gli assembly, ma che non sarebbe davvero contare come un sub-directory ...a meno che non si installi l'applicazione da qualche parte, in realtà non dovrebbe essere installata: P

+0

@Svish: quanto sopra sarebbe nel mio file .csproj? Il mio progetto è un'applicazione Win # C: non riesco a trovare un file .config. – Aishwar

+0

@ aip.cd.aish: C'è un esempio più completo su http://msdn.microsoft.com/en-us/library/4191fzwb(v=VS.90).aspx. Se non ci sono file di configurazione, puoi semplicemente crearne uno. Secondo http://msdn.microsoft.com/en-us/library/ms229689(v=VS.90).aspx, si suppone che sia denominato uguale all'applicazione con estensione .config. – Svish

+0

Il file potrebbe anche essere chiamato solo app.config ... ma non ne sono sicuro. Leggi i file di configurazione su MSDN e dovresti capirlo :) – Svish

Problemi correlati