J'ai finalement découvert un moyen d'utiliser la ligne de commande Matlab de .NET sans lien avec:Comment utiliser la ligne de commande Matlab depuis .NET sans lien?
variables Write de .NET dans un fichier MAT en utilisant dll "de csmatio" de David A. Zier.
Lire le fichier de Matlab, processus et enregistrer les résultats dans un fichier MAT:
var process = new Process() { StartInfo = new ProcessStartInfo() { FileName = MatlabExecutableFileName, Arguments = "-nodisplay " + "-nojvm " + " -r \"somecommands; " + "save FILENAME OUTPUTVARIABLES; " + "exit;\"" } }; process.Start();
Le pire: Attendez jusqu'à ce que le processus se termine.
L'approche naïve:
process.WaitForExit();
ne fonctionne pas parce que Matlab engendre l'application principale dans un nouveau thread
Regarder le fichier de sortie des changements est délicat:
new FileSystemWatcher(MatlabPath, fileName) .WaitForChanged(WatcherChangeTypes.All)
Ne travaillait pas à cause d'un bug sur cette classe.
Le code travaille actuellement est plus:
using (var watcher = new FileSystemWatcher(MatlabPath, fileName)) { var wait = new EventWaitHandle(false, EventResetMode.AutoReset); watcher.EnableRaisingEvents = true; watcher.Changed += delegate(object sender, FileSystemEventArgs e) { wait.Set(); }; foreach(var i in Enumerable.Range(0, 2)) { if (!wait.WaitOne(MillissecondsTimeout)) { throw new TimeoutException(); } } Thread.Sleep(1000); }
Mais je suis préoccupé par la dernière ligne de code. Le bloc de code ci-dessus a été écrit avec l'intention de l'éviter, mais je ne sais pas quoi faire d'autre. Cette quantité de temps sera trop sur certains ordinateurs et trop peu sur d'autres.
SOLUTION
var previousProcesses = Process
.GetProcessesByName("Matlab")
.Select(a => a.Id)
.ToArray();
process.Start();
process.WaitForExit();
var currentProcess = Process
.GetProcessesByName("Matlab")
.Where(a => !previousProcesses.Contains(a.Id))
.First();
currentProcess.WaitForExit();
Parfait! Ça a marché! –