20210512のC#に関する記事は4件です。

Visual Studio 2019 で linux コンソールアプリをデバッグする

.NET (Core) でのLinuxコンソールアプリのデバッグ 最近、Visual Studio 2019でWSL 2を用いてLinuxアプリのデバッグができるようになりました。 しかし、自分はつまづいた点がいくつかあったので、紹介したいと思います。 1. デバッグにWSL 2の選択がない Visual Studio の更新が終わったあと、試そうと思ったら こんな感じで選択肢に、WSL 2の選択肢がありませんでした。 これはすぐに解決しました。公式ホームページによると前提条件の一つに下の一文がありました。 .NET Core デバッグと WSL 2 オプション コンポーネントが含まれる Visual Studio 2019 v16.9 Preview 1 以降のバージョン。 [引用] はい「WSL 2 オプション コンポーネント」とやらが入っていなかっただけのようです。 というわけで、Visula Studio Installer から.NET Core Debugging with WSL 2コンポーネントをインストールします。 ただし、この時には「.NET Core クロスプラットホームの開発」のものを選択するようにしましょう。「ASP.NET と Web開発」にあるやつは関係ないです。 インストールが終わると、下のように普通に選択肢がでてきました。 2. デバッグ実行時のワーキングディレクトリどーすんの? 「Properties」ディレクトリにあるlaunchSettings.jsonのworkingDirectoryをいじることでできます。 たとえば、 launchSettings.json { "profiles": { "WSLDebug": { "commandName": "Project" }, "WSL 2": { "commandName": "WSL2", "workingDirectory": "/mnt/d" } } } Program.cs Console.WriteLine($"{Environment.CurrentDirectory}"); として実行することで、「出力」ウィンドウをみると実際に変更されていることがわかると思います。 3. 引数の指定はどーすんの? これも「Properties」ディレクトリにあるlaunchSettings.jsonのcommandLineArgsをいじることでできます。 たとえば、 launchSettings.json { "profiles": { "WSLDebug": { "commandName": "Project" }, "WSL 2": { "commandName": "WSL2", # 実際の環境では「WSLDebug.dll」のところは、自身のプログラムの「アセンブリ名.dll」とすること。 "commandLineArgs": "{OutDir}WSLDebug.dll arg1 arg2 arg3" } } } Program.cs Console.WriteLine($"{string.Join(" ", args)}"); として実行することで、「出力」ウィンドウをみると指定した引数が出力されていると思います。 最後に 以上の3点が自分がつまづいた点でした。 他にもディストリビューションごとにプロファイルを用意する方法や、詳しい起動プロファイルでの WSL の設定などは公式ホームページを参照してください。 環境 Windows 10 Pro 20H2 Visual Studio Community 2019 16.9.4 WSL 2 - Ubuntu 20.04.2 LTS dotnet 5.0.203 参照
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[C#] パフォーマンスモニタ(perfmon)で見るような情報をプログラムで取得する

もくじ https://qiita.com/tera1707/items/4fda73d86eded283ec4f やりたいこと パフォーマンスモニタで見るような情報を、自前のプログラムの中で見ていろいろやりたい。 ※自前のプログラムの中ではグラフ書いたりはしなくていいが、パフォーマンスに関する値だけほしい。 [Win+R]に「perfmon」と入れて出てきたウインドウで「パフォーマンスモニター」を選ぶと上記が開く。 やり方 System.DiagnosticsのPerformanceCounterクラスを使う。 サンプル 1秒おきに、CPUの使用率などの情報を取り、画面に表示する。 using System; using System.Collections.Generic; using System.Diagnostics; namespace DiagnosticsTest { class Program { static void Main(string[] args) { var counterList = new List<(string machine, string category, string counter, string instance)>(); var pcList = new List<PerformanceCounter>(); // コンピュータ名 = "." はローカルコンピュータを表す。コンピュータ名は省略可能(省略時は".") // Memory/Available MBytesのようにインスタンスを指定できない項目は、インスタンスを空文字にする // 取りたい情報を並べる counterList.Add((".", "Processor", "% Processor Time", "_Total")); counterList.Add((".", "Network Interface", "Bytes Total/Sec", "Realtek PCIe GBE Family Controller")); counterList.Add((".", "PhysicalDisk", "% Disk Time", "_Total")); counterList.Add((".", "Memory", "Available MBytes", "")); counterList.Add((".", "Process", "Working Set", "_Total")); counterList.Add((".", "Process", "IO Data Bytes/Sec", "_Total")); // エラーチェック後、PerformanceCounterオブジェクトの作成を作成 counterList.ForEach((x) => { if (!PerformanceCounterCategory.Exists(x.category, x.machine)) { //カテゴリが存在するか確かめる Console.WriteLine("登録されていないカテゴリです:" + x.category); } else if (!PerformanceCounterCategory.CounterExists(x.counter, x.category, x.machine)) { //カウンタが存在するか確かめる Console.WriteLine("登録されていないカウンタです:" + x.counter); } else { //PerformanceCounterオブジェクトの作成 pcList.Add(new PerformanceCounter(x.category, x.counter, x.instance, x.machine)); } }); //1秒おきに値を取得する while (true) { Console.Clear(); pcList.ForEach((x) => { //計算された値を取得し、表示する Console.WriteLine(x.CategoryName + " / " + x.CounterName + ":" + x.NextValue()); }); Console.WriteLine(""); //1秒待機する System.Threading.Thread.Sleep(1000); } } } } メモ 上のやり方で情報をとれることは分かったが、いったいどういう情報が取れるのか、また、取れる情報は「カウンターの追加」画面を見たら一覧が出てるっぽいが、一覧の中の項目それぞれが一体何なのか?(例えば「Process」の「Working Set」が一体なんなのか?)がわからず、調べるのに手間取った。そのときのメモ。 取れる情報について パフォーマンスモニターで取れる情報(たぶん≒PerformanceCounterクラスで取れる情報)は、「カウンターの追加」の画面に一覧として出てる。 PerformanceCounterクラスには、マシン名、カテゴリ名、インスタンス名を指定するが、それぞれ下記のようにカウンターの追加画面には表示されている。 メモするまでもないかもだが、それぞれ下記のようなイメージ。 項目 説明 マシン名 どのPCの情報をとるかということ。(試してないが、リモートPCの情報も見れるらしい) カテゴリ名 大項目。CPUごとの情報を取りたければProcessor、プロセスごとの情報を取りたければProcess、等。 カウンタ名 小項目。カテゴリの中のどういう情報か、を示すもの。CPUなら使用率(% Processor Time)、プロセスならメモリ使用量(Working Set)、等。 インスタンス名 測定対象をどれにするか、ということ。CPUなら複数あるCPUのうちのどれにするか、プロセスなら今起動してるプロセス(アプリ)のどれにするか、等。_Totalを選ぶと、全部の合計、だったりする。 カウンターにどんなものがあるか なにげにハマった内容。 パフォーマンスモニタに出てくる情報を取れることは分かったが、どんな情報をとれるのか、を知りたい。 MSDocsでその一覧を探したが、全然出てこない。 (いくつか、主だったところをいくつかわかりやすく紹介してくれているサイトはあった。下の「参照」に挙げている) 結局一覧は見つけられなかったが、「カウンターの追加」の画面に「説明を表示する」というチェックがあり、それをチェックすると、説明がでてくることを発見。 わかりやすい説明ではないが、これを見てどういう内容かはだいたいわかりそう。 これでどういうカウンタがあるか調べることにした。 参考 PerformanceCounterクラス(MSDocs) パフォーマンスカウンタ一つ一つの項目の説明(別の、似た内容の説明?サーバーがどうとか言ってる...) msdocs内を「Processor Time 」とかで調べるとでてきた内容。 めちゃわかりやすいカウンタの説明 private bytesとはなにか?を見たページ カウンタ解説
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# PDFの作成法

PDFは、「Portable Document Format」の略で、データを実際に紙に印刷したときの状態を、そのまま保存することができるファイル形式です。今回は Spire.PDFという無料のライブラリを利用して、PDFの作成法を紹介しましょう! 下準備 1.E-iceblueの公式サイトからFree Spire.PDF無料版をダウンロードしてください。 2.Visual Studioを起動して新規プロジェクトを作成してから、インストールされたファイルにあった相応しいSpire. PDF.dllを参照に追加してください。 (Net 4.0を例としたら、デフォルトパスは“Bin→NET4.0→PDF.dll”というようです。) コード using Spire.Pdf; using Spire.Pdf.Graphics; using System.Drawing; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //PdfDocument objectを作成します。 PdfDocument document = new PdfDocument(); //マージンを設定します。 PdfUnitConvertor unitCvtr = new PdfUnitConvertor(); PdfMargins margins = new PdfMargins(); margins.Top = unitCvtr.ConvertUnits(2.54f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); margins.Bottom = margins.Top; margins.Left = unitCvtr.ConvertUnits(3.17f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point); margins.Right = margins.Left; //新規ページを追加します。 PdfPageBase page = document.Pages.Add(PdfPageSize.A4, margins); //カスタムのPdfTrueTypeFont、PdfPenインスタンスを作成します。 PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Ms mincho", 20f), true); PdfPen pen = new PdfPen(Color.Black); //DrawStringメソッドでテキストを書きます。 string text = "初めてのPDFです!"; page.Canvas.DrawString(text, font, pen, 100, 50); //保存します・ document.SaveToFile("PDF作成.pdf"); } } } 実行結果  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#の文字列補完 $"{}" でInvariantCultureを強制する方法

結論から先に書くと、FormattableString.Invariant(FormattableString) Method を使いましょう。 var now = DateTime.UtcNow; var val = 12345.6789; Console.WriteLine($"CurrentCulture : {now}, {val:N}"); Console.WriteLine(FormattableString.Invariant($"InvariantCulture: {now}, {val:N}")); FormattableString fmtString = $"{now}, {val:N}"; Console.WriteLine("CurrentCulture : " + fmtString.ToString(System.Globalization.CultureInfo.CurrentCulture)); Console.WriteLine("InvariantCulture: " + fmtString.ToString(System.Globalization.CultureInfo.InvariantCulture)); Console.WriteLine("fr-FR-Culture : " + fmtString.ToString(System.Globalization.CultureInfo.GetCultureInfo("fr-FR"))); /* result output CurrentCulture : 2021/05/12 5:21:10, 12,345.68 InvariantCulture: 05/12/2021 05:21:10, 12,345.68 CurrentCulture : 2021/05/12 5:21:10, 12,345.68 InvariantCulture: 05/12/2021 05:21:10, 12,345.68 fr-FR-Culture : 12/05/2021 05:21:10, 12 345,68 */ InvariantCulture での文字列補完が必要なケース 日付の表記や、数値の桁区切りと小数点記号、通貨記号などは国や文化によって異なります。 C#では、OS実行環境等から現在の国と文化を得て、CultureInfo.CurrentCulture に情報を保持しています。 そして C#の文字列補完 $"{}" は、CultureInfo.CurrentCulture に従って日付や数値を文字列化します。 UI上に表示する文字列は CultureInfo.CurrentCulture に従った内容で良いのですが、クラウドやファイル上にデータを文字列化して保存する場合は、文字列化に用いた CultureInfo.CurrentCulture の内容を同時に記録しないと、データの解釈ができなくなります。それでは困るので特定の国や文化に依存しない中立的な表記で記録したいのですが、それに用いるのが CultureInfo.InvariantCulture です。 CultureInfo.InvariantCulture はC/C++言語における"C"ロカールに相当し、基本的に米国文化の内容です。 CultureInfo を指定して文字列補完するには 日付変数や実数変数の個々の文字列化であれば、ToString (string? format, IFormatProvider? provider) や ToString (IFormatProvider? provider) を用い、引数に CultureInfo を渡すことで、指定の CultureInfo に従った文字列化ができます。 文字列補完の場合は、FormattableString.ToString (IFormatProvider? formatProvider) を用い、FormattableString fmt = $"{val}"; fmt.ToString(cultureInfo); のように指定できますが、FormattableString を宣言する手間が必要となります。CultureInfo.InvariantCulture に限って、その手間を省くのが FormattableString.Invariant(FormattableString) Method なのです。 逆に同じ文字列補完に対して、複数のCultureInfoを適用したい場合には FormattableString.ToString (IFormatProvider? formatProvider) が有用です。国や文化の違いを並べて表示したり、国や文化をユーザ選択させるようなケースに役立つでしょう。 参考資料
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む