Cでのコンソールアプリケーションの意味のある使用#

すでに何かが書かれ、テストされ、その作業に値するものである場合、ホイールを再発明するよりもこのツールを使用する方が適切です。 たとえば、コンソールユーティリティcpctest.exeを使用すると、グラフィカルシェルと同じアクションをすべて実行できます。また、Windowsの標準セットから他の多くのユーティリティを実行できます。 同様の機能を使用した開発、デバッグ、テストには貴重な時間がかかります。 なぜそれを燃やすのですか? 始めましょう。



まず、 MSDNにアクセスして、標準コマンドの構文を確認する必要があります。 その結果、コンソールアプリケーションの起動は、アプリケーションの名前とそのパラメーターで構成されていることがわかります。 アプリケーションは、 Processシステムクラスによってインスタンス化されます。 コンソールアプリケーションを起動するための関数のプロトタイプは次のようになります。



bool Execute(string commandName, IEnumerable<string> paramsList)
      
      





実行中のアプリケーションの実行結果を取得して処理する場合、適切なメソッドが必要です。



 string GetResult (string commandName, IEnumerable<string> paramsList)
      
      





次に、MSDNに戻り 、Javaのように例外を厳密に処理する場合は、ProcessStartInfo ArgumentsUseShellExecuteRedirectStandardOutput 、およびRedirectStandardErrorを確認します。 そのため、プロセスを初期化するには、コンソールアプリケーションの起動モードとプロセスを開始する方法を決定するプロパティが必要です。 私のクラスでは、Facadeパターンを使用しました。



 public class CommandHelpers { public CommandHelpers() { Invisible = true; } public bool Invisible { get; set; } private Process CreateProcess(string commandName, IEnumerable<string> paramsList, bool output = false) { string paramString = paramsList.Aggregate<string, string>(null, (current, param) => current + " " + param); return new Process { StartInfo = { FileName = commandName, Arguments = paramString, UseShellExecute = output ? !output : !Invisible, RedirectStandardOutput = output } }; }
      
      





ping –t youwebsite.orgなど、実行中のアプリケーションは無期限に実行できることに注意してください。 それを実行するには、適切なメソッドが必要です。



 public Task<bool> ExecuteAsync(string commandName, IEnumerable<string> paramsList)
      
      





ソースコード:



使用例:
 public class CspHelpers { private readonly CommandHelpers _cryptoconsole; private readonly string _command = @"c:\Program Files\Crypto Pro\CSP\csptest"; public CspHelpers() { _cryptoconsole = new CommandHelpers(); } /// <summary> ///     /// </summary> /// <param name="driveName">  </param> /// <param name="containerName"> </param> /// <param name="type">   exchange  signature</param> /// <param name="certPath">   </param> /// <param name="password">  </param> /// <returns>  </returns> public string ImportToContainer(string driveName, int containerName, KeyType type, string certPath, string password) { var Params = new List<string>(); Params.Add("-keyset"); Params.Add("-container"); Params.Add(string.Format(@"\\.\FAT12_{0}\{1}", driveName[0], containerName)); Params.Add("-password"); Params.Add(password); Params.Add("-keytype"); Params.Add(type.ToString()); Params.Add("-impcert"); Params.Add(certPath); return _cryptoconsole.GetResult(_command, Params); } }
      
      







CommandHelpers.cs
 using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Common.Security { /// <summary> /// See for correct use https://technet.microsoft.com/en-us/library/bb491070.aspx /// </summary> public class CommandHelpers { public CommandHelpers() { Invisible = true; } /// <summary> /// Not show CMD window /// </summary> public bool Invisible { get; set; } /// <summary> /// Execete CMD command /// </summary> /// <param name="commandName">Command name only</param> /// <param name="paramsList">Params and keys for command</param> public bool Execute(string commandName, IEnumerable<string> paramsList) { return CreateProcess(commandName, paramsList).Start(); } /// <summary> /// Async execete CMD command /// </summary> /// <param name="commandName">Command name only</param> /// <param name="paramsList">Params and keys for command</param> public Task<bool> ExecuteAsync(string commandName, IEnumerable<string> paramsList) { return Task<bool>.Factory.StartNew(() => CreateProcess(commandName, paramsList).Start()); } /// <summary> /// Returns result of command execution /// </summary> /// <param name="commandName">Command name only</param> /// <param name="paramsList">Params and keys for command</param> /// <returns></returns> public string GetResult(string commandName, IEnumerable<string> paramsList) { var bufer = new StringBuilder(); using (var proc = CreateProcess(commandName, paramsList, true)) { proc.Start(); while (!proc.StandardOutput.EndOfStream) { bufer.AppendLine(proc.StandardOutput.ReadLine()); } } return bufer.ToString(); } /// <summary> /// Returns result of command execution /// Experemental. Not Tested. /// </summary> /// <param name="commandName">Command name only</param> /// <param name="paramsList">Params and keys for command</param> /// <returns></returns> public string GetResultAsync(string commandName, IEnumerable<string> paramsList) { var bufer = new StringBuilder(); using (var proc = CreateProcess(commandName, paramsList, true)) { proc.OutputDataReceived += (sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { bufer.AppendLine(e.Data); } }; proc.BeginOutputReadLine(); proc.EnableRaisingEvents = true; proc.WaitForExit(); } return bufer.ToString(); } private Process CreateProcess(string commandName, IEnumerable<string> paramsList, bool output = false) { var paramString = paramsList.Aggregate<string, string>(null, (current, param) => current + " " + param); return new Process { StartInfo = { FileName = commandName, Arguments = paramString, UseShellExecute = output ? !output : !Invisible, RedirectStandardOutput = output } }; } } }
      
      







UPD:



追加資料:



記事のインスピレーションの源:

ユーザーvedmakaから: toster.ru/q/7644



コンソールアプリケーションのGUIラッパー: en.jakeroid.com/gui-obertka-dlya-konsolnogo-prilozheniya-na-csharp.html



ユーザーevgenylから: habrahabr.ru/post/136766



All Articles