Как вызвать методы статического класса из msbuild? - PullRequest
3 голосов
/ 24 марта 2009

Как можно вызвать статический метод класса из msbuild и сохранить его результаты в списке?

РЕДАКТИРОВАТЬ: Хорошо, позвольте мне объяснить немного подробнее. Я использую конструктор файлов справки sandcastle для создания документации для моего приложения. Одним из требований является то, что вы должны указать источники документации следующим образом:

<DocumentationSources>
    <DocumentationSource sourceFile="$(MSBuildProjectDirectory)\..\src\myApp\bin\Debug\myApp.exe" xmlns="" />
    <DocumentationSource sourceFile="$(MSBuildProjectDirectory)\..\src\myApp\bin\Debug\myApp.xml" xmlns="" />
</DocumentationSources>

Sandcastle Help File Builder поставляется со сборкой утилит, которая позволяет извлекать все файлы dll и xml из указанного каталога. Я хочу вызвать метод из этой сборки и сохранить его результат в виде списка <DocumentationSource>. Это статический метод, который возвращает Collection<string>

Ответы [ 3 ]

17 голосов
/ 15 мая 2012

Пользовательские задачи - это здорово, но потенциальное излишество, если вы хотите сделать что-то простое. Я полагаю, что Драко спрашивает о функции Свойства функций в MSBuild 4 .

Пример установки свойства с использованием статической функции (скопированной непосредственно со страницы выше):

<Today>$([System.DateTime]::Now)</Today>

И для вызова статической функции по параметрам:

$([Class]:: Property.Method(Parameters))

Или, может быть, вы хотите что-то более безумное, как встроенные задачи .

3 голосов
/ 24 марта 2009

Создайте пользовательскую задачу, вызывая этот статический метод и возвращая массив ITaskItem.

Или

Вы можете попробовать использовать MSBuild Extension Pack Assembly.Invoke :

<PropertyGroup>
  <StaticMethodAssemblyPath>path</StaticMethodAssemblyPath>
</PropertyGroup>

<MSBuild.ExtensionPack.Framework.Assembly TaskAction="Invoke" 
                                          NetArguments="@(ArgsM)" 
                                          NetClass="StaticMethodClassName" 
                                          NetMethod="StaticMethodName" 
                                          NetAssembly="${StaticMethodAssemblyPath}">
        <Output TaskParameter="Result" PropertyName="R"/>
</MSBuild.ExtensionPack.Framework.Assembly>
2 голосов
/ 24 марта 2009

Как правило, наиболее гибким вариантом является создание пользовательской задачи MSBuild . Это весь непроверенный код, предназначенный просто для того, чтобы дать вам идею:

В вашем файле msbuild:

<UsingTask TaskName="FindFiles" AssemblyFile="FindFiles.dll" />

<!-- 
As you'll see below, SearchDirectory and SearchPatterns are input parameters,
MatchingFiles is an output parameter, SourceFiles is an ItemGroup assigned to
the output.
-->
<FindFiles SearchDirectory="$(MyDirectory)" SearchPatterns="*.dll;*.xml">
    <Output ItemName="SourceFiles" TaskParameter="MatchingFiles" />
</FindFiles>

<!-- You can then use the generated ItemGroup output elsewhere. -->
<DocumentationSources>
    <DocumentationSource sourceFile="@(SourceFiles)" xmlns="" />
</DocumentationSources>

FindFiles.cs:

using System;
using System.IO;
using System.Collections.Generic;

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

namespace FindFiles
{
    public class FindFiles : Task
    {
        // input parameter
        [Required]
        public string SearchDirectory { get; set; }

        // output parameter
        [Required]
        public string[] SearchPatterns { get; set; }

        [Output]
        public string[] MatchingFiles { get; private set; }

        private bool ValidateParameters()
        {
            if (String.IsNullOrEmpty(SearchDirectory))
            {
                return false;
            }
            if (!Directory.Exists(SearchDirectory))
            {
                return false;
            }
            if (SearchPatterns == null || SearchPatterns.Length == 0)
            {
                return false;
            }
            return true;
        }

        // MSBuild tasks use the command pattern, this is where the magic happens,
        // refactor as needed
        public override bool Execute()
        {
            if (!ValidateParameters())
            {
                return false;
            }
            List<string> matchingFiles = new List<string>();
            try
            {

                foreach (string searchPattern in SearchPatterns)
                {
                    matchingFiles.AddRange(
                        Directory.GetFiles(SearchDirectory, searchPattern)
                        );
                }
            }
            catch (IOException)
            {
                // it might be smarter to just let this exception fly, depending on
                // how you want the task to behave
                return false;
            }
            MatchingFiles = matchingFiles.ToArray();
            return true;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...