2012-02-08 11 views
5

Possiedo un pacchetto di Visual Studio che fa parte del suo lavoro avviando un processo esterno (usando System.Diagnostics.Process) e comunicando con esso tramite l'input/output standard. Attualmente, ho il percorso per il codice .exe hard-coded che ovviamente non è fattibile per la distribuzione effettiva dell'estensione. Qual è il modo giusto per imballare e distribuire il .exe con l'estensione? (E, in relazione, una volta che ho fatto, come faccio a scoprire a livello di codice il percorso per il file .exe installato.) Preferibilmente vorrei metterlo nel file .vsix così l'installazione è facile.Pacchetto .exe in .vsix e chiamata dall'estensione di Visual Studio

EDIT: ho posto la parte rilevante del mio codice su BitBucket (può essere utile a qualcun altro usando Roslyn): roslyn_process al fine di dare una migliore idea di quello che sto cercando di fare. Questo codice imposta la comunicazione tra un'estensione di Visual Studio utilizzando un'implementazione di AbstractProcessHandler e un processo separato utilizzando RoslynProcess. Quest'ultimo è tenuto informato delle modifiche ai file di codice in Visual Studio e del file di codice che viene visualizzato, quindi è in grado di fare analisi con informazioni aggiornate nonostante non sia in esecuzione come un'estensione di Visual Studio che imporrebbe i limiti di Roslyn su tutto il codice in fase di modifica.

MODIFICA 2: Utilizzando this answer, è possibile ottenere la directory dell'estensione. Posso includere un altro pacchetto in source.extension.vsixmanifest aggiungendolo all'elenco dei contenuti come tipo "Tipo di estensione personalizzata". Quindi lo .exe appare nella directory dell'estensione. Sembra che sia probabilmente la soluzione giusta anche se il modo di ottenere la directory è etichettato in MSDN come qualcosa che non dovrei usare.

Sembra che questo potrebbe essere il modo migliore per farlo anche se sembra hacker, nel qual caso lo posterò come risposta una volta che avrò tutto funzionante.

+1

@Kiquenet: Scusa, non ho una soluzione minima ben confezionata ... ma la risposta accettata è una soluzione unica. – perelman

risposta

5

Uno degli approcci più semplici a questo è che la DLL del pacchetto abbia un riferimento al progetto sull'EXE e che la classe del punto di ingresso (o qualche classe all'interno dell'EXE) sia pubblica. Quindi è possibile scrivere:

typeof(ExternalProcess).Assembly.Location 

che fornisce il percorso dell'EXE all'interno del percorso di estensione.

L'altra parte interessante di questo è che il packager VSIX dovrebbe includere automaticamente l'EXE nel VSIX poiché si tratta di un riferimento di progetto. Non devi inserire nulla nel tuo .vsixmanifest per l'EXE.

+0

Perché quando ho provato questo: includi un file EXE (che faceva riferimento a NancyFX), mi ha detto che NancyFX non era un nome sicuro e la compilazione non è riuscita. –

+0

Che cosa era "it"? In ogni caso, iniziare un'altra domanda qui è molto più appropriato di una conversazione su questo. –

+0

Non ho una domanda - Ho un avvertimento: quando si crea un VSPackage utilizzando VSK VS 2012, il modello crea un progetto con un nome attivo abilitato. Se fai riferimento a qualsiasi altra cosa in quel progetto, deve avere un nome forte, perché la denominazione forte è transitiva. –

Problemi correlati