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

时间:2014-04-11 02:27:29

标签: c# msbuild mstest csproj

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

我想宣布测试项目取决于构建.exe的项目,并将.exe drop放入$(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" ...)
    }
}

有没有办法在我的测试<ProjectReference文件中声明类似.csproj的内容,这样我才能实现这一目标?

(我不想让<Copy任务抓住被测程序的输出,因为在测试项目之前没有什么可以迫使MSBuild构建测试中的程序。)

3 个答案:

答案 0 :(得分:2)

  

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

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

<ProjectReference Include="..\ProjectA\ProjectA.csproj">
  <Project>{b402782f-de0a-41fa-b364-60612a786fb2}</Project>
  <Name>ProjectA</Name>
  <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>
  

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

构建后的操作。或者只是在原地测试exe。

答案 1 :(得分:1)

我不太明白你没有使用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)。

答案 2 :(得分:-1)

我认为你可以使用&#34; copy&#34;任务(可能在项目的 post-build 条件下调用)。

请考虑您只需使用Project -> Project build order即可在Visual Studio中控制构建顺序。 Visual Studio显示了一个对话框,允许您显式设置项目依赖项:如果您设置Test项目依赖于Foo项目而不是Foo之前正在构建Test(您可以检查它是否移动到选项卡&#34;在同一个Visual Studio对话框中构建顺序&#34;。