【问题标题】:Updating Visual Studio project references programmatically以编程方式更新 Visual Studio 项目引用
【发布时间】:2009-07-03 19:50:34
【问题描述】:

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

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

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

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

我的问题是:
1. 这听起来是否明智
2. 有没有人有这方面的经验和/或他们如何处理开发模式和发布模式之间的切换
3. 有没有人有任何处理解析 Visual Studio 项目文件的库。

澄清:

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

a) 我的应用程序包含 15 个项目。对于我正在处理的工作,我尝试使解决方案尽可能小,所以说我的解决方案中有 5 个项目。我现在需要调试/开发一个不在解决方案中的项目,所以我添加了这个项目,但我必须: - 将原始项目中的引用设置为指向项目引用而不是编译的 dll - 将新添加项目中的引用更改为指向适当的项目引用

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

b) 作为服务包构建过程的一部分,我复制其中一个项目,进行必要的代码更改并使用 Visual Studio 构建。为此,我必须更改对已编译 dll 的所有引用

【问题讨论】:

  • Gary,你需要 VS 版本的 Thunk!

标签: .net visual-studio


【解决方案1】:

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

例如

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

【讨论】:

  • 是的。这看起来比我的回答好;)
  • 原谅我的无知,但这两者不都等同于真实吗? IE:如果它等于真或不假。也许我只是错过了一些东西。
  • @Jeremy,你没有错过任何东西。我在最后一秒更改了条件,并没有回顾整个答案。固定
【解决方案2】:

老虎,老虎吼!!!

这是使用 DTE 和 VSProject 以编程方式添加引用。我评论了大部分解释的代码。但要补充的是,我确实抛出了大量不同的额外参考,因为我有点懒惰。但只需使用 Visual Studio 进行排序,就可以了。如果由于任何原因无法编译,请随时对我大喊大叫。

使用系统; 使用 System.Collections.Generic; 使用 System.ComponentModel; 使用 System.Linq; 使用 System.Runtime.InteropServices; 使用 System.Text; 使用 System.Windows.Forms; 使用 EnvDTE; 使用EnvDTE80; 使用EnvDTE90; 使用EnvDTE90a; 使用可扩展性; 使用 Microsoft.VisualStudio.Shell; 使用 Microsoft.VisualStudio.Shell.Design; 使用 Microsoft.VisualStudio.Shell.Interop; 使用 VSLangProj; 命名空间 ConsoleApplication2 { 课堂节目 { 静态无效主要(字符串 [] 参数) { //免责声明: //我通过扩展来做这个,得到 //对 DTE 的引用可能与您的工作方式不同 //有几种不同的方法可以做到这一点。但是 //VSProject的东西不应该是一个问题 //获取您的 DTE 参考,我正在使用来自 EnvDTE80 的 DTE2 //我还没有研究过最早的兼容版本是什么 //包是Microsoft.VisualStudio.Shell.Package DTE2 _appObject = Package.GetGlobalService(typeof(DTE)) as DTE2; //这将获取解决方案集中的第一个项目并将其转换为VSProject //注意Web项目使用不同的类型,比如VSWebProject //或者我忘记的东西... var pj = (VSProject)_appObject.Solution.Projects.Item(1).Object; //你的dll路径 pj.References.Add(@"c:\MyRefs\Pastry.dll"); } } }

【讨论】:

  • 不是您问题的完整答案,但我认为展示如何简单地在代码中完成它会有所帮助。
  • 这真是太棒了,谢谢!作为记录,如果要添加支持 (VSProject) 转换的引用,请在“引用管理器”中搜索“lang”,然后添加 VSLangProj 和 VSLangProj110(如果使用 Visual Studio 2012)。
【解决方案3】:

我认为您的第一个问题没有一个简单的答案。作为一项规则,我建议避免这种情况。手动处理难度大,管理它的代码也不是小事。

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

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

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

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

【讨论】:

  • 欢迎来到 Stack Overflow!感谢您发布您的答案!请注意,您应该在此处或此站点上发布有用的答案点,否则您的帖子可能会被删除See the FAQ where it mentions answers that are 'barely more than a link'。如果您愿意,您仍然可以包含该链接,但仅作为“参考”。答案应该是独立的,不需要链接。
【解决方案4】:

听起来很奇怪。

我的建议是这样的。

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

    \程序集\源代码

  2. 将预建的复制到;

    \组装\预建

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

    \组装\开发

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

所以现在,您总是根据已知文件夹中的预编译二进制文件构建您的产品,因此您永远不需要更改您的项目。但你可以随意切换版本。

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      Visual Studio Gallery 上的工具可能对您有所帮助。

      它可以在添加项目时将解决方案中的引用替换为项目,反之亦然。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-06
        • 2017-03-24
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多