【问题标题】:How to use different files in a project for different build configurations - Visual Studio C# .net如何在项目中为不同的构建配置使用不同的文件 - Visual Studio C# .net
【发布时间】:2010-10-06 17:18:53
【问题描述】:

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

由于其他限制,我不想创建包含共享项的单独程序集;我希望项目编译为单个程序集“foo.dll”,无论我正在制作哪个版本。

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

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

【问题讨论】:

    标签: c# .net visual-studio build


    【解决方案1】:

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

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

    【讨论】:

    • 如何在配置管理中创建我的平台? Visual Studio 2005 不允许我添加新的项目平台,它只给了我 x86 和 x64 以及 AnyCPU 选项。
    • 我有 2008,所以它可能会有所不同,但你进入配置管理器,然后在平台下拉列表中出现 选项。它会弹出一个带有组合框的窗口,可以手动编辑。
    • 是的,我可以为解决方案添加平台,但对于每个项目,我仅限于他们拥有的选项。我想如果它实际上是通过 /platform 选项传递给编译器的,那是有道理的。我将只使用不同的配置。
    • 您可能必须在解决方案文件中添加可能的配置。这很痛苦,因为可能存在很多配置|平台的组合。如果您并不真正关心 IDE 中的配置,您也可以手动更改它们,然后在发布时构建两者。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      您需要直接编辑 csproj 文件

      1. 卸载项目
      2. 编辑

      然后在您要有条件地包含的文件上

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 由于我连接到由 IE 提供的 API 在不同版本中有所不同,因此引用 API 会出现各种问题,以及具有不同的互操作程序集等等......用稍微不同的代码编译两个版本更简单。
        • 哦,太糟糕了 :(。看起来 Coincoin 的答案会做你想做的事。
        猜你喜欢
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 2012-03-03
        • 2015-12-14
        • 1970-01-01
        相关资源
        最近更新 更多