在自定义MSBuild任务中传递程序集引用

在自定义MSBuild任务中传递程序集引用,msbuild,fluent-nhibernate,Msbuild,Fluent Nhibernate,我正在尝试编写一个MSBuild任务,以使用FluentNhibernate映射构建数据库 当前任务的代码如下所示 public class CreateDatabase : Task { [Required] public string ConfigFile { get; set; } [Required] public string MappingAssemblyName { get; set; } public override

我正在尝试编写一个MSBuild任务,以使用FluentNhibernate映射构建数据库

当前任务的代码如下所示

public class CreateDatabase : Task
{
    [Required]
    public string ConfigFile
    { get; set; }

    [Required]
    public string MappingAssemblyName
    { get; set; }

    public override bool Execute()
    {
        var mappingAssembly = Assembly.Load(MappingAssemblyName);

        var config = new Configuration();
        config.Configure(ConfigFile);

        var fluentConfig = Fluently.Configure(config)
            .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly));

        var sessionSource = new SessionSource(fluentConfig);

        sessionSource.BuildSchema();

        return true;
    }
}
  <ItemGroup>
    <Content Include="hibernate.cgf.xml" />
  </ItemGroup>
  <UsingTask AssemblyFile="..\lib\MyUtilities.MSBuild.dll" TaskName="CreateDatabase" />
  <Target Name="Build" >
    <CreateDatabase ConfigFile="@(Content)" MappingAssemblyName="MyMappingAssemlyName" />
  </Target>
MSBuild的用法如下所示

public class CreateDatabase : Task
{
    [Required]
    public string ConfigFile
    { get; set; }

    [Required]
    public string MappingAssemblyName
    { get; set; }

    public override bool Execute()
    {
        var mappingAssembly = Assembly.Load(MappingAssemblyName);

        var config = new Configuration();
        config.Configure(ConfigFile);

        var fluentConfig = Fluently.Configure(config)
            .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly));

        var sessionSource = new SessionSource(fluentConfig);

        sessionSource.BuildSchema();

        return true;
    }
}
  <ItemGroup>
    <Content Include="hibernate.cgf.xml" />
  </ItemGroup>
  <UsingTask AssemblyFile="..\lib\MyUtilities.MSBuild.dll" TaskName="CreateDatabase" />
  <Target Name="Build" >
    <CreateDatabase ConfigFile="@(Content)" MappingAssemblyName="MyMappingAssemlyName" />
  </Target>

但现在我被卡住了

毫不奇怪,Assembly.Load失败,因为包含my Fluent映射的程序集(“MyMappingAssemly”)不存在


假设Fluent映射是在我的解决方案中的另一个项目中定义的,那么告诉我的MSBuild任务有关映射程序集的最佳方式是什么?我认为使用“MappingAssemblyName”属性可能走错了路。

我假设您想要获取项目输出的路径,该路径定义了“流畅的映射”。您可以像这样使用“GetTargetPath”目标:

<MSBuild Projects="..\path\to\projectfile" Targets="GetTargetPath">
    <Output TaskParameter="TargetOutputs" ItemName="ProjectPath"/>
</MSBuild>
Properties="Configuration=$(Configuration); Platform=$(Platform)"
但是,只有当引用项目的配置/平台与当前项目匹配时,这才能正常工作。如果解决方案文件设置了不同的值,则必须使用AssignProjectConfiguration任务


因为,我不确定这是否正是您想要的,如果需要,我将停在这里,稍后添加更多信息。

谢谢Ankit,这帮了大忙。虽然我似乎不得不使用“PropertyName”属性,而不是“ItemName”。我现在有一个单独的问题。我的自定义任务依赖于其他第三方程序集。当MSBuild执行任务时,如何确保这些程序集存在?添加了对调用任务的项目的引用。添加了此问题