2009-03-24 7 views
3

Comment appeler une méthode statique de classe à partir de msbuild et stocker ses résultats dans une liste?Comment appeler des méthodes de classe statique à partir de msbuild?

EDIT: Bon, laissez-moi vous expliquer un peu plus loin. J'utilise le constructeur de fichier d'aide de châteaux de sable pour générer de la documentation pour mon application. L'une des conditions est que vous devez spécifier les sources de documentation comme suit:

<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 est livré avec un ensemble de utils qui a un moyen de récupérer tous les fichiers dll et XML à partir d'un répertoire spécifié. Je veux appeler la méthode de cet assembly et stocker son résultat sous la forme d'une liste de <DocumentationSource>. Il s'agit d'une méthode statique qui renvoie Collection<string>

+0

Je ne comprends pas votre question. msbuild est un utilitaire pour construire (compiler/lier), pas un langage de programmation. Qu'essayez-vous de faire exactement? –

+0

Désolé à ce sujet. J'ai mis à jour la question – Draco

Répondre

2

En général, l'option la plus flexible est de créer un custom MSBuild task. Ceci est tout code non testé signifiait juste pour vous donner l'idée:

Dans votre fichier 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; 
     } 
    } 
} 
3

Créez une tâche personnalisée appelant cette méthode statique et renvoyant un tableau de ITaskItem.

Ou

Vous pouvez essayer d'utiliser le MSBuild Extension PackAssembly.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> 
15

tâches personnalisées sont overkill grande, mais le potentiel si vous vouloir faire quelque chose de simple. Je crois que Draco pose des questions sur le Property Functions feature in MSBuild 4.

Un exemple de définition d'une propriété en utilisant une fonction statique (arraché directement en haut page):

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

Et d'appeler une fonction statique sur les paramètres:

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

Ou, peut-être vous vouloir quelque chose de plus fou comme inline tasks.

+1

Les tâches en ligne sont incroyables, elles sont comme des scripts LINQPad dans votre script MSBuild! Merci de m'avoir éclairé! –

Questions connexes