2009-03-24 12 views
3

Wie ruft man eine statische Klasse-Methode von Msbuild und speichert seine Ergebnisse in einer Liste?Wie rufe ich statische Klassenmethoden von Msbuild auf?

EDIT: Okay, lassen Sie mich ein wenig weiter erklären. Ich verwende den Sandcastle-Hilfedatei-Generator, um Dokumentation für meine Anwendung zu generieren. Eine der Voraussetzungen ist, dass Sie die Dokumentation Quellen angeben müssen, wie folgt:

<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 kommt mit einer utils Anordnung, die eine Art und Weise des Abrufens alle DLL-und XML-Dateien aus einem bestimmten Verzeichnis hat. Ich möchte die Methode von dieser Assembly aufrufen und ihr Ergebnis als Liste von <DocumentationSource> speichern. Dies ist eine statische Methode, die Collection<string>

+0

Ich verstehe Ihre Frage nicht. Msbuild ist ein Dienstprogramm zum Erstellen (Kompilieren/Verknüpfen), keine Programmiersprache. Was versuchst du genau zu machen? –

+0

Entschuldigung. Ich habe die Frage aktualisiert – Draco

Antwort

2

Im Allgemeinen ist die flexibelste Möglichkeit ist, ein custom MSBuild task zu erstellen. Das ist alles nicht getesteten Code bedeutete nur, um Sie die Idee:

In Ihrer msbuild Datei:

<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

zurückgibt. Erstellen Sie eine benutzerdefinierte Task, die diese statische Methode aufruft und ein ITaskItem-Array zurückgibt.

Oder

Sie könnten versuchen, die MSBuild Extension PackAssembly.Invoke mit:

<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

benutzerdefinierte Aufgaben sind groß, aber Potenzial Overkill, wenn Sie möchte etwas Einfaches tun. Ich glaube, Draco fragt nach dem Property Functions feature in MSBuild 4.

Ein Beispiel eine Eigenschaft der Einstellung durch eine statische Funktion (von oben Seite direkt gerippt):

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

Und eine statische Funktion von Parametern aufzurufen:

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

Oder Sie vielleicht möchte etwas Verrückteres wie inline tasks.

+1

Inline-Aufgaben sind erstaunlich, sie sind wie LINQPad-Skripte in Ihrem MSBuild-Skript! Danke, dass du mich erleuchtet hast! –

Verwandte Themen