Workshop: Makro-gesteuerte Dateiverarbeitung

Gemeinsame Interfaces für Skripte und Hauptprogramm

Das Projekt Interfaces erzeugt eine Assembly, und diese Assembly ist an zwei Stellen zu referenzieren. Die Referenz im Hauptprogramm erfolgt einfach wie gewohnt in Visual Studio. Dadurch kann das Hauptprogramm diese Interfaces bereits benutzen.

Das erfolgt in der inneren Schleife, und zwar über einem Aufruf von ScriptExecutor.CreateInstance<T>(). Diese Methode ist dafür zuständig, das übergebene Skript zu kompilieren, und dann anhand der resultierenden Assembly die Instanz eines Objektes zu erzeugen, das die als Generic-Parameter übergebene Interface implementiert. Doch dazu später mehr. Das komplette Hauptprogramm sieht also folgendermaßen aus:

class Program {
static void Main(string[] args) {
DirectoryInfo directoryInfo = new DirectoryInfo(args[0]);
FileInfo[] fileInfos = directoryInfo.GetFiles();

foreach (FileInfo fileInfo in fileInfos) {
for (int i = 1; i < args.Length; i++) {
if (i == args.Length - 1) {
IFileActionExecutor action = ScriptExecutor.CreateInstance<IFileActionExecutor>( args[i]);
action.Execute(fileInfo);
} else {
IFilePatternMatcher o = ScriptExecutor.CreateInstance<IFilePatternMatcher>( args[i]);
if (! o.FileMatchesPattern(fileInfo)) {
break;
}
}
}
}
}
}

Dieses Programm lässt sich in der vorliegenden Form für beliebige filtergesteuerte Dateioperationen verwenden.

Die zweite Referenz auf die Assembly mit den Interface muss natürlich beim Übersetzen der Skripte zum Zuge kommen. Das ist aber weiter kein Problem: Schon die Version des C#-Compilers aus dem ersten Teil des Artikels konnte eine XML-Datei auslesen, in der zu referenzierende Assemblies eingetragen werden konnten. Das ist auch hier der Fall: Um die Interfaces-Assembly also in einem Skript verwenden zu können, ist nichts weiter zu tun, als die interfaces.dll in der Datei css.xml Datei einzutragen: Danach sind beide Interfaces beim Übersetzen des Skripts bekannt.