我有一个c#.net winforms解决方案,我想创建两个不同的版本:一个支持IE6,一个支持IE7。我的一个项目中的一些文件对于IE6构建与IE7构建是不同的,所以当我为IE7构建IE6时构建IE6和IE7文件时,我想要包含IE6文件。在这种情况下构建我的解决方案的最佳方法是什么?
由于其他限制,我不想创建包含共享项的单独程序集;我希望项目能够编译成单个程序集'foo.dll',无论我正在构建哪个构建。
我以为我可以创建两个单独的项目来编译为'foo.dll',然后创建两个发布配置,并且只在相关配置中包含相关项目。但是,我需要在两个项目中包含IE6和IE7相同的文件,我无法看到如何在两个项目中使用文件的单个副本(当我添加现有项目时,它会创建一个副本项目目录)。我正在使用SVN进行源代码控制,所以也许可以使用它来进行文件夹之间的“共享”,但怀疑这是最好的方式..
注意:由于IE中的API差异需要不同的构建,其细节与问题无关 - 只要相信我需要两个版本。
答案 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文件
然后在你想要有条件地包含
的文件上<Compile Include="IE6.cs" Condition=" '$(Platform)' == 'IE6' " />
<Compile Include="IE7.cs" Condition=" '$(Platform)' == 'IE7' " />
<Compile Include="IE.cs" />
答案 3 :(得分:0)
我不确定如何做你要问的问题,但是你不能在dll中包含两个版本的API包装器并确定在运行时调用哪一个?例如,如果用户安装了应用程序的IE6版本然后升级到IE7,该怎么办?他们需要重新安装,对吧?
在我看来,这将是一个更简单的解决方案,但也许我错过了一些东西......