如何在项目中为不同的生成配置使用不同的文件-Visual Studio C#.net

如何在项目中为不同的生成配置使用不同的文件-Visual Studio C#.net,c#,.net,visual-studio,build,C#,.net,Visual Studio,Build,我有一个c#.net winforms解决方案,我想创建两个不同的版本:一个支持IE6,另一个支持IE7。我的一个项目中的一些文件与IE6版本和IE7版本不同,因此我希望在为IE6构建时包含IE6文件,在为IE7构建时包含IE7文件。针对这种情况构建解决方案的最佳方式是什么 由于其他限制,我不想创建包含共享项的单独程序集;我希望项目编译为单个程序集“foo.dll”,而不管我正在进行哪个构建 我想我可以创建两个单独的项目,编译成“foo.dll”,然后创建两个版本配置,并且只在相关配置中包含相关

我有一个c#.net winforms解决方案,我想创建两个不同的版本:一个支持IE6,另一个支持IE7。我的一个项目中的一些文件与IE6版本和IE7版本不同,因此我希望在为IE6构建时包含IE6文件,在为IE7构建时包含IE7文件。针对这种情况构建解决方案的最佳方式是什么

由于其他限制,我不想创建包含共享项的单独程序集;我希望项目编译为单个程序集“foo.dll”,而不管我正在进行哪个构建

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


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

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


在我看来,这将是一个更简单的解决方案,但可能我缺少了一些东西…

在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)


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

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

右键单击项目并选择添加>>现有项
在文件选择器中选择文件
单击文件选择器中“添加”按钮右侧的小三角形
选择添加为链接

这会将文件添加到项目中,而不制作副本


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

< P>假设您使用VS2005或以上,可以使用Project文件中的条件属性。

您需要直接编辑csproj文件

  • 卸载项目
  • 编辑
  • 然后在要有条件包括的文件上

    <Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " />
    <Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " />
    <Compile Include="IE.cs"  />
    
    
    
    由于我正在连接IE提供的API,该API在不同版本中是不同的,因此引用这些API以及使用不同的互操作程序集等会出现各种问题。。。用稍微不同的代码编译两个版本更简单。哦,太糟糕了:(.看起来Coincoin的答案可以满足您的要求。如何在配置管理中创建平台?Visual Studio 2005不允许我添加新的项目平台,它只提供x86和x64以及任意CPU选项。我有2008,所以可能会有点不同,但您可以进入configuration manager,然后进入平台下拉列表这里有一个选项。它会弹出一个窗口,其中有一个组合框,可以手动编辑。是的,我可以为解决方案添加平台,但对于每个项目,我仅限于它们拥有的选项。我想如果它实际通过/platform选项传递给编译器,这是有意义的。我将使用不同的配置。您可能需要添加广告d解决方案文件中可能的配置。这是一个痛苦的问题,因为可能存在许多配置与平台的组合。如果您不真正关心IDE中的配置,那么您也可以手动更改它们,并且在发布时构建这两个配置。