如何轻松切换构建的参考路径?

时间:2010-09-23 21:16:43

标签: c# .net visual-studio-2008 visual-studio-2010 msbuild

我有一个用于软件的项目。所以我在我的项目中引用了该软件的DLL库,这样我就可以通过他们的API编写代码并为软件制作一些不错的插件和扩展。

问题是该软件有多种版本:Enterprise,Lite,1.6版,1.7版,2.0版等。如果我希望我的项目适用于所有这些不同的版本,我必须复制我的项目和将DLL引用重新指向相应软件版本的DLL库(我现在正在这样做)。这真的很烦人,因为我的代码库对于所有版本都是相同的,所以当我进行任何更新时,我必须同步所有重复的项目,所以我有每个软件版本的构建。

有没有办法让我可以拥有一个项目,但在我构建之前,选择要构建的软件版本?我想我正在寻找一种简单的方法来更新项目中DLL引用的路径。任何想法或提示将不胜感激。

(如果有帮助,我可以使用Visual Studio 2008或2010和.NET 3.5或4.0)

5 个答案:

答案 0 :(得分:8)

我直接使用项目文件的经验非常有限,但我很确定你可以为许多不同的设置添加条件。在您的情况下,您可以为Reference或关联的ItemGroup添加条件。

然后你可以这样做:

<ItemGroup>
  <Reference Include="System" />
  <Reference Include="System.Core" />
  <Reference Include="System.Data.Linq" />
  <Reference Include="System.Xml.Linq" />
  <Reference Include="MyLibrary" Condition=" '$(ProjectVersion)'=='4' ">
    <HintPath>..\..\..\..\..\..\..\Libv4\MyLibrary.dll</HintPath>
  </Reference>
  <Reference Include="MyLibrary" Condition=" '$(ProjectVersion)'=='5' ">
    <HintPath>..\..\..\..\..\..\..\Libv5\MyLibrary.dll</HintPath>
  </Reference>
  ...
</ItemGroup>

语法可能有误,但想法就在那里。我相信这样做是可行的。

答案 1 :(得分:2)

修改项目文件中的HintPath元素(正如其他答案中提到的那样,IMO不是一个好主意,因为Visual Studio使用此字段存储它应该看起来的位置,如果在所有其他“好”中没有什么是找到)。在我们公司,我们有类似的情况。我们通过在解决方案中设置每个项目的ReferencePath来解决这个问题。

如果您必须为大型解决方案执行此操作,那么手动操作非常烦人。 因此我们为VS编写了一个AddIn for VS.设置Project的ReferencePath非常简单,所以我认为这个任务也可以通过VS Macro完成。

以下是由Marco设置ReferencePath的代码:

    Sub SetReferencePath()
    Dim project As Project

    For Each project In DTE.Solution.Projects

        If project.Kind = CodeModelLanguageConstants.vsCMLanguageCSharp Then
            project.Properties.Item("ReferencePath").Value = "PATH1;PATH2;..."

        End If

    Next
    End Sub

ReferencePath属性的值是以分号分隔的路径列表。使用ReferencePath而不是设置提示元素的另一个优点是,您可以在不同的驱动器上使用绝对路径,这是使用提示元素无法实现的恕我直言。

答案 2 :(得分:0)

我认为您可以创建许多配置,并在proj文件中添加一些msbuild逻辑,以有条件地设置引用路径属性,并让您的引用使用该属性。如果您熟悉在项目文件中编辑XML,那么这并不难;如果你不是,那么...希望其他人能帮助解决这些问题。

答案 3 :(得分:0)

Visual Studio 2008和2008 .csproj文件是XML文件。参考路径是这些XML文件中的简单字符串,如果使用文本编辑器打开.csproj,则可以检查它(查找“HintPath”,或检查此http://geekswithblogs.net/murraybgordon/archive/2005/10/25/58103.aspx)。

你能做的就是编写一个小程序,自动构建不同的参考路径。 Visual Studio构建可以使用DEVENV.EXE自动完成,有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/xee0c8y7(VS.80).aspx

答案 4 :(得分:0)

在引用路径中使用$(configuration)$(ProjectVersion)来切换引用。

  1. $(configuration)是“调试”或“发布”或任何其他自定义的配置。
  2. $(ProjectVersion)是您的环境可行的。

因此您可以在一行中完成所有参考,并且在调试和发布方面更加坚定:

    <Reference Include="YourLibrary">
        <HintPath>..\bin\$(configuration)\$(ProjectVersion)\YourLibrary.dll</HintPath>
    </Reference>

如果您的文件夹带有前缀或后缀,则可以随意将其附加在行中,例如:

    <Reference Include="YourLibrary">
        <HintPath>..\bin\$(configuration)-test\Lib-$(ProjectVersion)\YourLibrary.dll</HintPath>
    </Reference>