繁体   English   中英

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

[英]How to use different files in a project for different build configurations - Visual Studio C# .net

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

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

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

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

在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属性,而不是创建中间属性。

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

右键单击该项目,然后选择Add >> Existing Item
在文件选择器中选择文件
单击文件选择器中“添加”按钮右侧的小三角形
选择添加为链接

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

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

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

您需要直接编辑csproj文件

  1. 卸载项目
  2. 编辑

然后是你想要有条件地包含的文件

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM