Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从多个源文件创建MSBuild内联任务_C#_Msbuild_Msbuild Task - Fatal编程技术网

C# 如何从多个源文件创建MSBuild内联任务

C# 如何从多个源文件创建MSBuild内联任务,c#,msbuild,msbuild-task,C#,Msbuild,Msbuild Task,我有几个CS文件(一个DLL项目),都在一个目录中,其中一个类扩展了ITask。现在,如何从一个源文件创建内联任务很容易,而且有文档记录,但是否可以从多个源文件创建内联任务?我不能编译和使用DLL作为一项任务,如果我不必将所有源代码塞进一个大的源文件中,我更愿意这样做 我的目标是: <UsingTask TaskName="foo" TaskFactory="CodeTaskFactory" AssemblyFile="Microsoft.Build.Tasks.v4.0.dll">

我有几个CS文件(一个DLL项目),都在一个目录中,其中一个类扩展了ITask。现在,如何从一个源文件创建内联任务很容易,而且有文档记录,但是否可以从多个源文件创建内联任务?我不能编译和使用DLL作为一项任务,如果我不必将所有源代码塞进一个大的源文件中,我更愿意这样做

我的目标是:

<UsingTask TaskName="foo" TaskFactory="CodeTaskFactory" AssemblyFile="Microsoft.Build.Tasks.v4.0.dll">
  <Task>
    <Code Type="Class" Language="cs" Source="mydir\*.cs"/>
  </Task>
</UsingTask>

由于没有其他答案,这里有一个完整的示例,可以根据注释中提到的任意数量的源文件在运行中构建dll。两个源文件:

sometask.cs:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Bar;

namespace Foo
{
  public class CustomTask : Task
  {
    public override bool Execute()
    {
      Log.LogWarning( LogString.Get() );
      return true;
    }
  }
}
sometask_impl.cs:

namespace Bar
{
  public static class LogString
  {
    public static string Get()
    {
      return "task impl";
    }
  }
}
以及目标使用Foo.CustomTask但首先生成的msbuild文件:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="MyBuild">

  <PropertyGroup>
    <SomeTaskDll>SomeTask.dll</SomeTaskDll>
  </PropertyGroup>

  <Target Name="BuildSomeTaskDll">
    <Csc Sources="$(MSBuildThisFileDirectory)sometask*.cs"
         References="System.dll;mscorlib.dll;Microsoft.Build.Framework.dll;Microsoft.Build.Utilities.v4.0.dll"
         TargetType="Library" OutputAssembly="$(MSBuildThisFileDirectory)$(SomeTaskDll)"/>
  </Target>

  <UsingTask TaskName="Foo.CustomTask" AssemblyFile="$(SomeTaskDll)"/>

  <Target Name="MyBuild" DependsOnTargets="BuildSomeTaskDll">
    <Foo.CustomTask />
  </Target>

</Project>

SomeTask.dll
相关输出:

> msbuild sometask.targets
Project sometask.targets on node 1 (default targets).
BuildSomeTaskDll:
<here it's building SomeTask.dll>

sometask.targets(17,5): warning : task impl
>msbuild sometask.targets
在节点1上投影sometask.targets(默认目标)。
BuildSomeTaskDll:

为什么您不能编译和使用dll?因为这应该是可行的(使用Cs任务),而且似乎也是合适的解决方案。我是,但我希望能够轻松地更改任务。如果我只有DLL(上帝禁止它也在VCS中签入),那么更改两个源代码然后提交二进制DLL太痛苦了。另一个混合选项(我可能会采用)是将任务的源代码作为一个项目保存在VCS中,并保存在我的项目中,该项目使用任务DLL来引用任务项目,并知道DLL将在何处着陆和执行。我在考虑将所有内容都保存在源代码中。我的观点是,将源代码保存在VCS中的msbuild文件等旁边,并在调用msbuild文件时生成dll,然后在同一生成文件(或任何其他文件)中使用它。这是两个世界中最好的,也是很好的炫耀:P