如何引用一个项目而不在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在测试项目之前构建测试中程序了。)

如何引用一个项目而不在csproj中链接到它

我想声明,测试项目取决于构建.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项目,则FooTest之前生成(您可以在同一Visual Studio对话框的"生成顺序"选项卡中检查它)。