如何在项目中使用不同的文件以用于不同的构建配置 - Visual Studio C#.net

时间:2009-02-10 18:33:02

标签: c# .net visual-studio build

我有一个c#.net winforms解决方案,我想创建两个不同的版本:一个支持IE6,一个支持IE7。我的一个项目中的一些文件对于IE6构建与IE7构建是不同的,所以当我为IE7构建IE6时构建IE6和IE7文件时,我想要包含IE6文件。在这种情况下构建我的解决方案的最佳方法是什么?

由于其他限制,我不想创建包含共享项的单独程序集;我希望项目能够编译成单个程序集'foo.dll',无论我正在构建哪个构建。

我以为我可以创建两个单独的项目来编译为'foo.dll',然后创建两个发布配置,并且只在相关配置中包含相关项目。但是,我需要在两个项目中包含IE6和IE7相同的文件,我无法看到如何在两个项目中使用文件的单个副本(当我添加现有项目时,它会创建一个副本项目目录)。我正在使用SVN进行源代码控制,所以也许可以使用它来进行文件夹之间的“共享”,但怀疑这是最好的方式..

注意:由于IE中的API差异需要不同的构建,其细节与问题无关 - 只要相信我需要两个版本。

4 个答案:

答案 0 :(得分:12)

在MSBuild中,您可以为项目组指定条件。然后,您可以将这些条件绑定到目标设备。

示例:

<!-- 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>

请注意,所有文件都将出现在IDE中,但在编译时,所有文件都应正确对齐。

然后,您需要做的就是在配置管理中创建您的平台(IE6和IE7)。

您也可以直接使用platform属性,而不是创建中间属性。

答案 1 :(得分:3)

为了在两个或更多项目中添加相同的文件,您可以

右键单击该项目,然后选择添加&gt;&gt;现有项目
选择文件选择器中的文件
单击文件选择器中“添加”按钮右侧的小三角形 选择添加为链接

这会将文件添加到项目中而不复制它。

我不知道你情况的所有细节,但你的解决方案听起来很尴尬。同一个dll的两个版本可能会在客户端计算机上最终导致配置问题。我鼓励您考虑Kevin对具有所有功能的单个dll的想法,并根据需要调用适当的代码。

答案 2 :(得分:2)

假设您使用的是VS2005或更高版本,则可以使用项目文件中的Condition属性。

您需要直接编辑csproj文件

  1. 卸载项目
  2. 修改
  3. 然后在你想要有条件地包含

    的文件上
    <Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " />
    <Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " />
    <Compile Include="IE.cs"  />
    

答案 3 :(得分:0)

我不确定如何做你要问的问题,但是你不能在dll中包含两个版本的API包装器并确定在运行时调用哪一个?例如,如果用户安装了应用程序的IE6版本然后升级到IE7,该怎么办?他们需要重新安装,对吧?

在我看来,这将是一个更简单的解决方案,但也许我错过了一些东西......

相关问题