通过 EnvDTE 在 C# 中以编程方式添加项目引用(而不是程序集引用)

Posted

技术标签:

【中文标题】通过 EnvDTE 在 C# 中以编程方式添加项目引用(而不是程序集引用)【英文标题】:Adding programmatically in C# a project reference (as opposed to an assembly reference) via EnvDTE 【发布时间】:2012-07-16 20:00:41 【问题描述】:

在 Visual Studio 中,当您在 .csproj 文件中的解决方案中添加对现有项目的引用时,结果如下:

<ProjectReference Include="..\TestProject2\TestProject2.csproj">
  <Project>15EC8369-B0C5-4F71-A366-19042F450A2D</Project>
  <Name>TestProject2</Name>
</ProjectReference>

如果我通过 EnvDTE 添加对程序集 DLL 的引用:

var p = _project as VsProject;
p.References.Add(<path to assembly DLL>);

这样结束:

<Reference Include="TestProject2.csproj">
  <HintPath>..\TestProject2\bin\Debug\TestProject2.csproj.dll</HintPath>
</Reference>

这不是很好,因为如果我切换到发布版本,它仍然会引用调试程序集。另一个问题是我必须先构建引用的程序集,然后才能将其添加为引用。使用 Visual Studio UI,我可以添加对未构建项目的引用。

是否可以通过 EnvDTE API 添加项目引用?

我知道我可以将 .csproj 文件作为 XML 文档进行操作并做任何我想做的事情,但由于我从 EnvDTE 的路径开始我更愿意坚持下去。

【问题讨论】:

【参考方案1】:

看起来References 接口有一个处理项目到项目引用的AddProject 方法。

【讨论】:

我相信您还可以通过提供项目名称来使用 Add.References 添加对项目的引用。见blogs.msdn.com/b/murat/archive/2008/07/30/… 收到此错误。 msdn.microsoft.com/en-us/library/ms228768(v=vs.110).aspx 试过解决方案还是不行。【参考方案2】:

对我有用的是以这种方式制定参考:

<Reference
  Include="MyDll"
  Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
  <HintPath>..\..\somePath\Debug\myDll.dll</HintPath>
</Reference>
<Reference
  Include="MyDll"
  Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
  <HintPath>..\..\somePath\Release\myDll.dll</HintPath>
</Reference>

这样,release构建引用release依赖,debug构建引用Debug。 当然,如果需要也可以处理x86/x64。这是针对 32 位应用程序的。

【讨论】:

以上是关于通过 EnvDTE 在 C# 中以编程方式添加项目引用(而不是程序集引用)的主要内容,如果未能解决你的问题,请参考以下文章

EnvDTE.DTE 为 Visual Studio 2015 创建空的 C++ 项目

如何在 C# 中以编程方式安装 Windows 服务?

在 C# 中以编程方式检查字符串是不是包含有效的 C# 代码

如果应用程序具有应用程序清单,如何在 C# 中以编程方式获取?

在 C# 中以编程方式设置 Windows XP Embedded 区域设置

在 C# 中以编程方式杀死进程树