如何在不链接到 csproj 中的项目的情况下引用项目?

Bil*_*eal 5 c# msbuild mstest csproj

我有一个测试项目,它运行一个程序 (a .exe) 并确保结果按预期出现。

我想声明测试项目依赖于构建 的项目,.exe并将.exedrop 放入$(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" ...)
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法<ProjectReference在我的测试.csproj文件中声明类似 a 的东西,这将允许我实现这一目标?

(我不想让<Copy任务获取被测程序的输出,因为这样就没有什么可以强制 MSBuild 在测试项目之前构建被测程序了。)

Ron*_*eil 6

我想声明测试项目取决于构建 .exe 的项目......

在项目参考 ( source )上设置ReferenceOutputAssembly为:false

<ProjectReference Include="..\ProjectA\ProjectA.csproj">
  <Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
  <Name>ProjectA</Name>
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)

...并将 .exe 放到 $(OutDir)(或 $(OutputPath))的子目录中

构建后操作。或者就地运行测试中的 exe。


mak*_*umi 3

我不太明白您不使用 的原因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>
Run Code Online (Sandbox Code Playgroud)

或者,您可以保留ProjectReference但只是在ResolveProjectReferences目标之后劫持构建过程,并将 exe 作为依赖项删除(从_ResolvedProjectReferencePaths)。