2009-02-10 61 views
9

我有一个c#.net winforms解决方案,我想创建两个不同的构建:一个支持IE6和一个支持IE7。我的一个项目中的一些文件对于IE6版本与IE7版本不同,所以我想在为IE6构建IE6时包含IE6文件,为IE7构建时包含IE7文件。针对这种情况构建解决方案的最佳方式是什么?如何在不同的构建配置项目中使用不同的文件 - Visual Studio C#.net

由于其他限制,我不想创建包含共享项目的单独程序集;我希望项目能够编译成单个程序集“foo.dll”,而不管我制作的是哪个版本。

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

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

回答

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

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

0

我不知道如何去做你在问什么,但是你不能只在你的API包装器中包含这两个版本的DLL并确定在运行时调用哪一个?例如,如果用户安装应用的IE6版本然后升级到IE7会怎么样?他们需要重新安装,对吧?

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

+0

由于我的文件m挂钩到IE提供的API中,这个API在不同版本中有所不同,因此存在各种各样的问题渲染API,以及具有不同的互操作程序集等......编译两个版本稍微不同的代码更简单。 – Rory 2009-02-10 19:03:07

+0

噢,太糟糕了:(看起来Coincoin的答案会做你想做的事情) – 2009-02-10 19:10:57

3

为了增加相同的文件在两个或两个以上的项目,你可以

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

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

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

2

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

你需要编辑的csproj文件直接

  1. 卸载项目
  2. 编辑

然后要有条件地包括

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