2012-02-08 6 views
5

Tengo un paquete de Visual Studio que hace algo de su trabajo iniciando un proceso externo (usando System.Diagnostics.Process) y comunicándose con él por entrada/salida estándar. Actualmente, tengo la ruta al .exe codificada, que obviamente no es factible para implementar realmente la extensión. ¿Cuál es la forma correcta de empaquetar y distribuir el .exe con la extensión? (Y, relacionado, una vez que lo he hecho, cómo descubro la ruta al archivo .exe por medio de la instalación. Preferiblemente me gustaría ponerlo en el archivo .vsix para que la instalación sea fácil.Paquete .exe en .vsix y llamada desde la extensión de Visual Studio

EDIT: He colocado la parte pertinente de mi código en BitBucket (puede ser útil a otra persona usando Roslyn): roslyn_process con el fin de dar una mejor idea de lo que estoy tratando de hacer. Este código establece la comunicación entre una extensión de Visual Studio utilizando una implementación de AbstractProcessHandler y un proceso por separado usando RoslynProcess. Este último se mantiene informado de las modificaciones a los archivos de código en Visual Studio y qué archivo de código se está viendo, por lo que es capaz de hacer análisis con información actualizada a pesar de no ejecutarse como una extensión de Visual Studio que impondría las limitaciones de Roslyn en todo el código que se está editando.

EDIT 2: Utilizando this answer, puedo obtener el directorio de la extensión. Puedo incluir otro paquete en source.extension.vsixmanifest agregándolo a la lista de contenido como tipo "Tipo de extensión personalizada". Luego, el .exe aparece en el directorio de la extensión. Parece que esta es probablemente la solución correcta, aunque la forma de obtener el directorio está etiquetada en MSDN como algo que no debería usar.

Parece que esta podría ser la mejor manera de hacerlo, aunque parezca un hack, en cuyo caso lo publicaré como respuesta una vez que todo esté funcionando.

+1

@Kiquenet: Lo siento, no tengo una solución mínima perfectamente empaquetada ... pero la respuesta aceptada es de una sola línea. – perelman

Respuesta

5

Uno de los enfoques más simples para esto es hacer que su paquete DLL tenga una referencia de proyecto al EXE y hacer que su clase de punto de entrada (o alguna clase dentro del EXE) sea pública. Luego puede escribir:

typeof(ExternalProcess).Assembly.Location 

que le da la ruta al EXE dentro de su ruta de extensión.

La otra buena parte de esto es que el paquete VSIX debe incluir el EXE en el VSIX automáticamente, ya que es una referencia de proyecto. No tiene que poner nada en absoluto en su .vsixmanifest para el EXE.

+0

Porque cuando probé esto: incluye un EXE (que hace referencia a NancyFX), me decía que NancyFX no tenía un nombre fuerte y que la creación fallaba. –

+0

¿Qué era "eso"? En cualquier caso, comenzar otra pregunta aquí es mucho más apropiado que una conversación sobre este tema. –

+0

No tengo una pregunta. Tengo una advertencia: cuando crea un VSPackage usando el SDK de VS 2012, la plantilla crea un proyecto con un fuerte nombre habilitado. Si se refiere a cualquier otra cosa en ese proyecto, debe tener un nombre fuerte, porque el nombre fuerte es transitivo. –

Cuestiones relacionadas