2010-10-25 17 views
10

Paso la mayor parte del tiempo desarrollando controles tanto para WPF como para Silverlight usando la misma base de código. Para hacer esto agrego los archivos existentes de un proyecto (por ejemplo, Silverlight) "como enlaces" al otro (digamos WPF). Para pequeñas diferencias utilizo directivas del preprocesador comoVisual Studio: "Este documento lo abre otro proyecto"

#if SILVERLIGHT 
... 
#else 
... 
#endif 

El código de estos bloques aparece desactivado dependiendo del tipo de proyecto que haya abierto el archivo. Entonces, si abre su archivo desde el proyecto Silverlight (donde está definida SILVERLIGHT), la parte else es gris e Intellisense no funciona.

Para que la parte de WPF sea procesada por IDE (con colores e Intellisense), debe abrir el archivo desde el proyecto de WPF. Cuando intenta hacer eso, aparece un cuadro de mensaje que dice "Este documento está abierto por otro proyecto" y cuando hace clic en Aceptar, muestra ese archivo en el contexto del proyecto Silverlight (no es lo que quería ver). Así que tengo que cerrar el archivo, navegar al proyecto WPF nuevamente y abrir el archivo nuevamente. Esto es muy, muy molesto.

Así que la pregunta es: ¿hay algún tipo de configuración o complemento que haga que Visual Studio vuelva a abrir el archivo del proyecto donde hice doble clic en él en lugar de mostrar ese estúpido cuadro de mensaje y mostrarme ese archivo del proyecto "incorrecto"?

+4

Hasta ahora no hay solución para este problema aparte de cerrar el archivo. Además, es la razón por la cual dll bloquea la excepción "No se puede construir ..." en VS2010. –

+0

Me pregunto si teóricamente es posible que el complemento maneje esto: reciba una notificación antes de que el usuario intente abrir un archivo, busque si el mismo archivo ya está abierto desde otro proyecto, cierre ese archivo y vuelva a abrir desde el proyecto actual. Suena factible si tales API están en su lugar. –

+1

Hombre, eso sería realmente bueno. Es molesto tener que cerrar y abrir el archivo todo el tiempo. – andrecarlucci

Respuesta

2

Podría hacer esto un poco más fácil de trabajar utilizando clases parciales y múltiples archivos: código compartido que es igual para WPF y Silverlight en un archivo vinculado compartido, y un archivo separado para cada uno que contiene el código específico de uno u otro (con firmas de método/propiedad idénticas), cada uno de los cuales está solo en uno de los proyectos. Hacer esto permite que las versiones de WPF y Silverlight se abran a la vez (ya que son archivos separados) a costa de agregar una gran cantidad adicional de administración de archivos.

Más allá de eso, obtenga algo de memoria adicional y use soluciones por separado.

+0

Comparto archivos entre dos proyectos en la misma solución, y el pobre VS constantemente me da este mensaje de "abierto por otro proyecto". Este error ha estado presente en varias versiones de VS (estoy usando VS2015). Me pregunto si alguien lo ha informado a MSFT para que lo sepan. –

4

Esto me ha sucedido aproximadamente dos veces en un mes, no en una aplicación WPF. No tengo idea de por qué sucede, pero en ambos casos la solución fue Limpiar la solución, reiniciar la PC (no solo reiniciar Visual Studio) y luego crear la solución.

1

Sí, esto es posible utilizando Visual Studio Shell.

Primera instantiate EnvDTE80.DTE2 objeto:

private static EnvDTE80.DTE2 _dte; 

public static EnvDTE80.DTE2 DTE 
{ 
    get 
    { 
     if (_dte == null) 
      _dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2; 

     return _dte; 
    } 
} 

y luego:

// On Document Opening, close the existing instances. 
// This event occurs when you double-click file in Solution Explorer. 

DTE.Events.DocumentEvents.DocumentOpening += (s, e) => 
{ 
    if(!DTE.ItemOperations.IsFileOpen(YOURFILENAME)) 
     return; 

    foreach(Window win in DTE.Documents.Cast<Document>() 
         .FirstOrDefault(s => s.FullName == YOURFILENAME).Windows)) 
     win.Close(); 
} 

// next; VS itself will call DTE.ItemOperatins.OpenFile(YOURFILENAME); 

HTH.

1

Se me ocurrió cuando tenía un proyecto que contenía un archivo vinculado de otro proyecto en una sola solución de VS. Cuando traté de navegar a la definición de un método en el archivo vinculado, VS solicitó con un mensaje que este documento sea abierto por otro proyecto.

Para resolver esto, tuve que descargar el proyecto que posee el archivo original de la solución VS. Después de eso, navegar a la definición del método en tiempo normal y el tiempo de depuración no era un problema.

Cuestiones relacionadas