私は最終的にリンクせずに、.NETからのコマンドラインMATLABを使用する方法を発見した:デイヴィッドA. Zierの「csmatio」DLLを使用してMATファイルへ.NETからリンクなしで.NETのコマンドラインMatlabを使用するには?
書き込み変数。
は、プロセスを、MATLABからファイルを読み込み、MATファイルに結果を保存します。
var process = new Process() { StartInfo = new ProcessStartInfo() { FileName = MatlabExecutableFileName, Arguments = "-nodisplay " + "-nojvm " + " -r \"somecommands; " + "save FILENAME OUTPUTVARIABLES; " + "exit;\"" } }; process.Start();
最悪の部分:プロセスが完了するまでお待ちください。
単純なアプローチ:
MATLABは、変更のために、出力ファイルのために見て、新しいスレッドprocess.WaitForExit();
でメインアプリケーションを生成しますので、
は動作しませんがトリッキーである:
new FileSystemWatcher(MatlabPath, fileName) .WaitForChanged(WatcherChangeTypes.All)
このクラスのバグのために動作していませんでした。
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); }
しかし、私は、コードの最後の行が心配です:
現在作業コードが長くなっています。上のコードブロックはそれを避けるために書かれていましたが、私は何をすべきか分かりません。この時間は、一部のコンピュータではあまりにも多く、他のコンピュータでは少なすぎます。
SOLUTION私は完全に質問を(あなたは、本質的に、MATLABプロセスは、右完了したときに検出しようとしている?)を理解していますが、MATLABのメインを見つけることができなかった場合
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();
パーフェクト!出来た! –