2012-05-23 19 views
5

Sto provando a creare un semplice programma c# utilizzando Growl C# API.csc.exe riferimento file .dll esterno

ho provato a compilare il mio programma in due modi diversi:

1) ho mantenuto il mio file .dll nella stessa directory del mio file .cs. Ho eseguito

csc /r:Growl.Connector.dll,Growl.CoreLibrary.dll /out:test.exe *.cs 

Ha compilato bene e anche eseguito bene.

2) Ora ho creato una directory dentro la mia directory di lavoro corrente denominata growl e mantenuto tutti i miei riferimenti .dll lì.

Ora, quando provo a compilare con il comando di seguito

csc /r:"D:\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.Connector.dll","D: 
\Modified\Growl_NET_Connector_SDK\libraries\growl\Growl.CoreLibrary.dll" /out:test.exe *.cs 

E compilato bene, ma quando ho provato a farlo funzionare è verificata l'eccezione di seguito indicato.

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Growl.Connector, Version=2.0.0.0, Culture=n 
eutral, PublicKeyToken=980c2339411be384' or one of its dependencies. The system cannot find the file specified. 
at GrowlNotification.Program.Main(String[] args) 

Quindi, la mia domanda è: qual è il modo corretto per fare riferimento .dll file in csc quando i file sono in una cartella esterna.

Ecco lo directory structure per il secondo caso.

risposta

9

Quindi, la mia domanda è qual è il modo corretto di fare riferimento al file .dll in csc quando i file si trovano in una cartella esterna.

Ti stai già facendo riferimento a build tempo. Devi solo renderli disponibili al esecuzione, ma copiarli nella stessa directory del file eseguibile, quando vuoi eseguirlo.

Si potrebbe anche investigare usando la Global Assembly Cache se questi sono assembly firmati, ma personalmente mi limiterei a mantenere solo l'eseguibile con le librerie da cui dipende.

+0

Quindi non è possibile mantenere il file '.dll' in una cartella esterna ed eseguire il mio' .exe' semplicemente facendo doppio clic su di esso. Come capisco dalla tua risposta che il file '.dll' dovrebbe essere presente nella stessa cartella di .exe in fase di esecuzione. – RanRag

+0

@Noob: Credo che potrebbe trovarsi in una * sottodirectory * se si aggiunge un file app.config per specificare il rilevamento del percorso del cestino privato, ma si tratta solo di aggiungere ancora più complessità. È tutto * molto * più semplice se tutto è nella stessa directory. –

+0

Grazie per le informazioni. – RanRag

1

È possibile aggiungerli utilizzando le opzioni della riga di comando/lib e/reference durante la compilazione.

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

Ma (citazione dall'articolo)

Un'alternativa all'uso/lib è copiare nella directory di lavoro eventuali assembly richiesti; questo ti permetterà di passare semplicemente il nome al/riferimento. È quindi possibile eliminare gli assembly dalla directory di lavoro . Poiché il percorso all'assembly dipendente non è specificato nel manifest manifesto, l'applicazione può essere avviata su il computer di destinazione e troverà e utilizzerà l'assembly nella cache di assembly globale .

Poiché il compilatore può fare riferimento all'assembly non implica che il runtime linguaggio comune sia in grado di trovare e caricare l'assembly al runtime . Vedere Come il runtime individua gli assembly per i dettagli su come il runtime cerca gli assembly referenziati.

quindi la risposta di Jon Skeet è migliore. (Sto solo aggiungendo questo per fornire più informazioni di quelle che potrei in un commento, non come risposta.La risposta di Jon è la migliore IMO)

0

Puoi creare symlinks negli assembly nella cartella delle tue librerie in modo da avere solo bisogno per tenerli aggiornati in un'unica posizione.

Problemi correlati