如何引用一个项目而不在csproj中链接到它
本文关键字:csproj 链接 一个 何引用 引用 项目 | 更新日期: 2023-09-27 17:57:54
我有一个测试项目,它运行一个程序(.exe
)并确保结果如预期的那样出现。
我想声明测试项目依赖于构建.exe
的项目,并将.exe
放置到$(OutDir)
(或$(OutputPath)
)的子目录中。
$(OutDir)MyTests.dll
(试验项目)$(OutDir)'Product'Foo.exe
(测试项目)$(OutDir)'Product'xxx.dll
(测试项目的依赖项)
这样我就可以写一个测试形式:
[TestClass]
[DeploymentItem("Product", "Product")]
public class RunFoo
{
[TestMethod]
public void HelpTextMatches()
{
// System.Diagnostics.Process.Start("Product'foo.exe" ...)
}
}
有没有一种方法可以在我的测试.csproj
文件中声明类似<ProjectReference
的东西,使我能够实现这一点?
(我不想让<Copy
任务只获取测试中程序的输出,因为这样就没有什么可以强迫MSBuild在测试项目之前构建测试中程序了。)
我想声明,测试项目取决于构建.exe…的项目
在项目参考(来源):上将ReferenceOutputAssembly
设置为false
<ProjectReference Include="..'ProjectA'ProjectA.csproj">
<Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
<Name>ProjectA</Name>
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
并将.exe放置到$(OutDir)(或$(OutputPath))的子目录中
生成后操作。或者只是在测试中运行exe。
我不太理解您不使用ProjectReference
的原因,但这基本上与添加ProjectReference
一样,只是没有添加程序集引用。
<ItemGroup>
<ExtraDependencies include="ExeProject.csproj" />
</ItemGroup>
<Target Name="GetExtraDependenciesTargets">
<MSBuild Projects="@(ExtraDependencies)" Targets="GetTargetPath">
<Output TaskParameter="TargetOutputs" ItemName="ResolvedDependencyTargets" />
</MSBuild>
</Target>
<Target Name="BuildExtraDependencies"
BeforeTargets="BeforeBuild"
DependsOnTargets="GetExtraDependenciesTargets"
Inputs="@(ExtraDependencies)"
Outputs="@(ResolvedDependencyTargets)">
<MSBuild Projects="@(ExtraDependencies)" Targets="Build">
<Output TaskParameter="TargetOutputs" ItemName="BuiltDependencyTargets" />
</MSBuild>
</Target>
或者,您可以保留ProjectReference
,但只需在ResolveProjectReferences
目标之后劫持构建过程,并将exe作为依赖项(从_ResolvedProjectReferencePaths
中)删除。
我认为您可以使用"复制"任务(可能在项目的后构建条件中调用)来实现这一点。
请注意,只需使用Project -> Project build order
就可以在Visual Studio中控制生成顺序。Visual Studio显示了一个对话框,允许您显式设置项目依赖关系:如果您设置Test
项目依赖于Foo
项目,则Foo
在Test
之前生成(您可以在同一Visual Studio对话框的"生成顺序"选项卡中检查它)。