以编程方式更新Visual Studio项目引用

时间:2009-07-03 19:50:35

标签: .net visual-studio

我希望以编程方式更新Visual Studio解决方案中项目中的引用。

我的解决方案中有大约15个项目,当我开发/调试时,我希望引用指向解决方案中的项目。

作为我的发布过程的一部分,我有时需要制作一个项目的副本,然后更新引用以指向某个文件夹中的内置dll。

我可以计算项目文件的结构以及引用如何在其中工作,我正在考虑构建一个命令行工具来解析项目文件并根据需要更改引用。

我的问题是:
这听起来是否合理 2.有没有人经历过这种情况和/或他们如何处理开发和发布模式之间的切换 3.有没有人有任何处理解析Visual Studio项目文件的库。

澄清:

感谢您的回复。也许我应该澄清一些我希望使用它的情况。

a)我的应用程序包含15个项目。我尽量保持解决方案尽可能小,因为我在解决方案中有5个项目。我现在需要调试/开发一个不在解决方案中的项目,所以我添加了这个项目,但我必须: - 将原始项目中的引用设置为指向项目引用而不是编译的dll - 更改新添加项目中的引用以指向相应的项目引用

我希望我的工具能够自动执行此操作,这是我所知道的唯一方法,因此目前这样操作项目文件

b)作为Service Pack构建过程的一部分,我会获取其中一个项目的副本,进行必要的代码更改并使用Visual Studio进行构建。要做到这一点,我必须更改编译的dll的所有引用

6 个答案:

答案 0 :(得分:9)

我认为更好的方法是直接在项目文件中的引用上使用条件块。然后你需要做的就是在msbuild中为“release”构建设置一个特定的标志,它将获取正确的引用。

例如

<ItemGroup Condition="'$(IsRelease)'=='True'">
  <Reference Include="..." />
</ItemGroup>
<ItemGroup Condition="'$(IsRelease)'!='True'">
  <Reference Include="..." />
</ItemGroup>

答案 1 :(得分:1)

Tiger,Tiger ROAR !!!

这是使用DTE和VSProject编程添加引用。我评论了大部分解释的代码。但补充一点,我确实抛出了大量不同的额外参考,因为我有点懒。但只是使用Visual Studio排序,你应该没问题。如果由于任何原因这不编译随意对我大喊大叫。


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using EnvDTE;
using EnvDTE80;
using EnvDTE90;
using EnvDTE90a;
using Extensibility;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Design;
using Microsoft.VisualStudio.Shell.Interop;
using VSLangProj;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //Disclaimer: 
            //I am doing this through an extention, Getting 
            //a ref to DTE may not work quite the same for you as 
            //there are several different ways to do it. But the 
            //VSProject stuff shouldn't be an issue

            //Get your DTE Reference, I'm using DTE2 from EnvDTE80 
            //I hadn't dug into whats the earilest compatible version
            //The Package is Microsoft.VisualStudio.Shell.Package
            DTE2 _appObject = Package.GetGlobalService(typeof(DTE)) as DTE2;

            //This gets the first project in the solution set and casts it as a VSProject
            //Note that Web projects use a different type , Something like VSWebProject 
            //or something I forget...
            var pj = (VSProject)_appObject.Solution.Projects.Item(1).Object;

            //Your dll path
            pj.References.Add(@"c:\MyRefs\Pastry.dll");
        }
    }
}


答案 2 :(得分:1)

我认为你的第一个问题没有一个简单的答案。作为一项规则,我建议避免这种情况。手动处理很困难,管理它的代码并不简单。

那就是说,我遇到了一个我工作的情况,我根本无法解决这个问题。在我们的例子中,我们正在努力发布一个需要包含一组示例项目的SDK。这些项目的“开发”版本既使用项目引用,也使用第三方库的引用。

这将我们带到#3,基本上是,是的。我实际上发布了open source project with a library, a simple windows utility and a NAnt extension to automatically change project references to dll references。实际上,它还处理将第三方库移动到同一本地文件夹并更新项目文件中的引用。

这个解决方案并不完美,我希望有时间添加很多改进,但它确实适用于我们的情况。我们发布脚本的一部分全部在NAnt中运行此过程以交换所有对相对路径的引用。然后我们可以轻松地捆绑整个设置。有一天,我可能会有时间在项目中添加MSBuild任务。

同样,我认为最好尽可能避免这种情况,但如果你像我一样陷入困境 - 我发布的代码至少应该有所帮助。

答案 3 :(得分:0)

听起来很奇怪。

我的建议是这样的。

  1. 将具有预建版本的项目拆分为单独的解决方案。让它们全部构建到

    \组件\ fromsource

  2. 将预建的复制到;

    \组件\预建

  3. 在开发其余项目之前,将任一目录复制到

    \组件\发展

  4. 将项目更改为指向\ assembly \ development中的版本。

  5. 现在,您始终在已知文件夹中针对预编译的二进制文件构建产品,因此您永远不需要更改项目。但你可以随意在版本之间进行交换。

    对于奖励积分,更改预建事件以在事物开始构建之前复制dll,并使源文件夹根据配置而变化。然后在DEBUG和RELEASE旁添加PREBUILT配置。

答案 4 :(得分:0)

我认为如果您使用Microsoft.Build.BuildEngine库,则可以在加载后以编程方式操作项目。

http://msdn.microsoft.com/en-us/library/microsoft.build.buildengine.aspx

答案 5 :(得分:0)

视觉工作室库中有工具可以帮助你。

在添加项目时,它可以用项目替换项目中的引用,反之亦然。

https://visualstudiogallery.msdn.microsoft.com/056617a4-da39-4d7b-8ecf-933009d9b721