2009-02-10 19 views
9

Tengo una solución c .net winforms y quiero crear dos compilaciones diferentes: una que admita IE6 y otra que admita IE7. Algunos de los archivos en uno de mis proyectos son diferentes para la versión de IE6 versus la de IE7, por lo que quiero incluir los archivos de IE6 cuando construyo para IE6 y los archivos de IE7 cuando construyo para IE7. ¿Cuál es la mejor manera de estructurar mi solución para esta situación?Cómo utilizar diferentes archivos en un proyecto para diferentes configuraciones de compilación - Visual Studio C# .net

Debido a otras limitaciones, no quiero crear un ensamblaje separado que contenga los elementos compartidos; Quiero que el proyecto se compile en un único ensamblado 'foo.dll', independientemente de la compilación que esté realizando.

Pensé que podría simplemente crear dos proyectos separados que se compilan en 'foo.dll', luego crear dos Configuraciones de versión y solo incluir el proyecto relevante en la configuración correspondiente. Sin embargo, necesitaría incluir los archivos que son iguales para IE6 e IE7 en ambos proyectos, y no puedo ver cómo usar una sola copia de un archivo en dos proyectos (cuando agrego un elemento existente, crea una copia en el directorio del proyecto). Estoy usando SVN para el control de fuente así que tal vez podría usar eso para hacer 'compartir' entre carpetas, pero dudo que sea la mejor manera ...

NB: Se necesitan diferentes compilaciones debido a las diferencias API en IE, detalles de los cuales no son relevantes para la pregunta, solo créanme que hay dos compilaciones requeridas.

Respuesta

12

En MSBuild, puede especificar condiciones a los grupos de artículos. A continuación, puede vincular esas condiciones al dispositivo de destino.

Ejemplo:

<!-- Declare the condition property at the beggining of the build file --> 
<PropertyGroup Condition="$(Platform) == 'IE7'"> 
    <UseNewLibrary>true</UseNewLibrary> 
</PropertyGroup> 

<PropertyGroup Condition="$(Platform) == 'IE6'"> 
    <UseNewLibrary>false</UseNewLibrary> 
</PropertyGroup> 


<!-- Then those the property to select the right file --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Compile Include="Class1.cs"/> 
    <Compile Include="Class2.cs"/> 
    <Compile Include="Class3.cs"/> 
    <Compile Include="Class4.cs"/> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Compile Include="Class1Old.cs"/> 
    <Compile Include="Class2Old.cs"/> 
    <Compile Include="Class3Old.cs"/> 
    <Compile Include="Class4Old.cs"/> 
</ItemGroup> 

<!-- And now references --> 
<ItemGroup Condition="$(UseNewLibrary)==true"> 
    <Reference Include="MyAssembly, Version=1.1.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

<ItemGroup Condition="$(UseNewLibrary)==false"> 
    <Reference Include="MyAssembly, Version=1.0.6.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> 
</ItemGroup> 

Tenga en cuenta que todos los archivos aparecerán en el IDE, pero en el momento de compilación de todo deben alinearse correctamente.

Luego, todo lo que necesita hacer es crear sus plataformas (IE6 e IE7) en la gestión de la configuración.

También puede usar directamente la propiedad de plataforma en lugar de crear una propiedad intermedia.

+0

¿Cómo creo mis plataformas en la gestión de la configuración? Visual Studio 2005 no me deja agregar nuevas plataformas de proyectos, solo me da el x86 y x64 y las opciones de AnyCPU. – Rory

+0

Tengo 2008, por lo que podría ser un título diferente, pero vaya al administrador de configuración, luego en la lista desplegable Plataforma hay disponibles . Aparecerá una ventana con un cuadro combinado que se puede editar a mano – Coincoin

+0

Sí, puedo agregar plataformas para la solución, pero para cada proyecto estoy limitado a las opciones que tienen. Supongo que tiene sentido si en realidad se pasa al compilador con la opción/platform. Solo usaré diferentes Configuraciones en su lugar. – Rory

0

No estoy seguro de cómo hacer lo que está preguntando, pero ¿no podría simplemente incluir ambas versiones de su envoltorio de API en el dll y determinar a cuál llamar en tiempo de ejecución? Por ejemplo, ¿qué pasa si un usuario instala la versión IE6 de su aplicación y luego se actualiza a IE7? Tendrán que volver a instalar, ¿verdad?

Me parece que esto sería una solución mucho más simple, pero tal vez me falta algo ...

+0

Desde I' m conectándome a una API proporcionada por IE que es diferente en las diferentes versiones, hay varios problemas que se presentan con refe reenviar las API, además de tener diferentes ensamblados de interoperabilidad, etc. ... Es simplemente más simple compilar dos versiones con un código ligeramente diferente. – Rory

+0

Oh, lástima :(Parece que la respuesta de Coincoin hará lo que quieras. –

3

Con el fin de añadir el mismo archivo en dos o más proyectos puede

Haga clic derecho sobre el proyecto y seleccione Añadir >> Artículo
existente Seleccione el archivo en el filepicker
Haga clic en el pequeño triángulo en la parte Lado derecho del botón Agregar en el selector de archivos
Elija Agregar como enlace

Esto agregará el archivo al proyecto sin hacer una copia del mismo.

No conozco todos los detalles de su situación, pero su solución suena incómoda. Dos versiones de la misma DLL probablemente conduzcan a problemas de configuración en las computadoras cliente eventualmente. Los animo a que consideren la idea de Kevin de tener un dll único con todas las capacidades, y que llamen al código apropiado según sea necesario.

2

Suponiendo que está utilizando VS2005 o superior, puede usar la propiedad Condition en el archivo del proyecto.

Tendrá que editar el archivo directamente csproj

  1. Descargar proyecto
  2. Editar

luego en los archivos que desea incluir condicionalmente

<Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " /> 
<Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " /> 
<Compile Include="IE.cs" /> 
Cuestiones relacionadas