potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C#

C# 匿名型と「is not {...} x」パターンマッチングのサンプルコード

C#

動作確認環境:C# 9.0 「++C++; // 未確認飛行 C」に匿名型とis not {...} x形式パターンマッチングの記事(リンクは記事末尾)がありました。どちらも使ったことがなかったので、自分用のサンプルコードとして。 using System; // 匿名型の作成 var t = new…

C# Win32エラーコードをHRESULTへ変換する関数GetHRForWin32Error

C#

動作確認環境:C# 8.0(.NET Core 3.1)、9.0(.NET 5.0) Win32エラーコードをHRESULTへ変換する関数です。System.Runtime.InteropServices.MarshalクラスはDllImport属性の付いた関数の最終エラー(呼び出し直後のGetLastError関数の結果)からHRESULTへ変…

C# レコードにCreate静的メソッドを持たせる

C#

動作確認環境:C# 9.0(.NET 5) レコードは特殊なクラス(参照型の複合型)であり、クラス同様の静的メソッドを持つことができます。これを利用してインスタンスの作成を試行するCreate静的メソッドを実装できます。クラスの当たり前はレコードでも可能であ…

C# 9.0 複合型に加わったレコード

C#

C#の複合型は構造体とクラスの2種類であり、C# 8までキーワードはclassとstructだけでした。C# 9.0からはここにrecordキーワードが追加されました。recordの実体は特別扱いされるクラスです。 型の分類を表にすると以下のような状態かと思います。レコードは…

C# 9.0 Windows 10の拡張子の分類情報等を取得する

Windows 10で拡張子の分類情報など(Perceived Type等)を取得するにはWin32APIのAssocGetPerceivedType関数を使用します。以下はそのサンプルコードです。recordやnew (...)を使用しているのでC# 9.0以降対応です。 using System; using System.Runtime.Int…

C#言語関係

C#

このブログのC#言語記事のまとめページです。ページ名の前に8、9、8-9がある場合、そのバージョン(C# 8、9、8-9)で動作確認しています。 言語機能 文字列 コレクション・LINQ 実行ファイル プラットフォーム呼び出し(P/Invoke)全般 その他 Windows開発 …

C# isによる3種類のパターンマッチング

C#

動作確認環境:C# 9.0(.NET 5.0) isによるパターンマッチングの概要と具体例です。 概要 isパターン 概要 型パターン 式の型キャスト結果を変数に保持してキャスト可否を返却する。 定数パターン 式が定数式を満たすか判定する。 varパターン 式の結果をロ…

C# 9.0 ushortのushort範囲制限加減算

C#

ushort型の加減算のはみ出し switch式による加減算はみ出しの抑制 isのvarパターンによるはみ出し抑制 Math.Clampによる例 ushort型の加減算のはみ出し ushort型はint型として加減算されるため、計算結果がushortの範囲(0-0xffff)をはみ出す場合があります…

C# WinAPIを使ったHLS色構造体

動作確認環境:C# 9.0(.NET 5) WinAPIを使ったHLS色構造体のコードです。Color型およびタプル(Tuple<ushort, ushort, ushort>およびValueTuple<ushort, ushort, ushort>)との相互変換をサポートしています。Colorとは異なりひとつの整数で表すことを前程としないため、IComparableおよびIComparable<T>は実装</t></ushort,></ushort,>…

C# 9.0 P/Invokeで使う構造体の管理方法いくつか

C#ではP/Invokeで使う構造体をいくつかの方法で実装できます。ここでは実用性は別としていくつかの方法を紹介します。ボックス化の回避などは割愛しています。 構造体として扱う 通常の構造体 読み取り専用構造体 絶対サイズ指定の構造体 絶対サイズ指定の読…

C# 9.0 メモリ割り当て文字列のカスタムマーシャラー

はじめに カスタムマーシャラー CoTaskMem→Unicode文字列 HLOCAL→Unicode文字列 FormatMessageWの例 参考 はじめに C#では以下の手順でアンマネージ関数のP/Invoke時にマーシャリングをカスタマイズできます。 ICustomMarshalerインターフェイスを実装したク…

C# 絶対サイズ指定の構造体は全体コピーされる

C#

C# 9.0ではStructLayout属性のSize引数を指定した構造体は通常のコピーでも全部(Sizeバイト分)コピーされます。P/Invoke以外ではメンバー変数のカバー範囲だけコピーされるかと思っていましたが、カバー範囲外もコピーされていました。Win32 APIのVARIANT…

C# プロパティシステムのサンプルコード

C# .NET5.0(.net5.0-windows)でWindowsのプロパティシステムの情報を操作する自分用のサンプルコードを記録しています。 シェルアイテムのプロパティの名前から値(PROPVARIANT)を取得する。 シェルアイテムのプロパティの名前から値(書式化文字列)を取…

C# Math.NET Numericsで正規分布に従う乱数の発生と平均の標準誤差の推定量計算

C#

C#ではGitHubでMITライセンス公開されているMath.NET Numericsを使用して、正規分布に従う乱数の発生と記述統計量の計算ができます。計算できる記述統計量には不偏標準偏差も含まれるため、以下のようにして正規分布に従う乱数から平均の標準誤差の推定量を…

C# IShellFolder::GetAttributesOfの定義時の注意

IShellFolder::GetAttributesOfの最後の引数はマスクにも使われるので戻り値に移動できない。 C#でWin32 APIのIShellFolder::GetAttributesOfメソッドを利用する場合は戻り値をvoid(エラーを手動処理する場合はint)型にします。他のメソッドのように最後の…

URL Protocol値を持つProgIDキーエントリの一覧抜粋

Windows 10環境でURL Protocol値を持つProgIDキーエントリの一覧抜粋と列挙用のコードです。意外と多くのProgIDが登録されていました。 iTunes関係は多いので削除しています。Acrobat、Office、Kindle、xbox(プリインストール)、Skype、OneDrive、GitHub、…

C# シェルの「shell:~」形式からパスを取得する

Windowsではシェルに「shell:~」形式の名前を与えると特殊フォルダを開けます。C#でこの形式からパスを取得するには、一度Win32 APIのParseDisplayName関数でアイテムIDリストを取得して、取得したアイテムIDリストをWin32 APIのSHGetPathFromIDListEx関数…

C# Known Folderの表示名と型名を取得する(SHGetFileInfo版)

C# 9(トップレベルステートメント) Main関数(C# 8) 動作確認環境:C# 8.0(.NET Core 3.1)、C# 9.0(.NET 5.0) SHGetKnownFolderIDList→アイテムIDリスト→SHGetFileInfoW→表示名・型名 Win32 APIのSHGetKnownFolderIDListとSHGetFileInfoWを使用してKn…

ShellFolderキーを持つCLSIDキーエントリの一覧

Windows 10環境のOLEScriptキーを持つCLSIDキーエントリの一覧です。一部Office関係等は除外しています。 CLSID 表示名 InProcServer32 {00020D75-0000-0000-C000-000000000046} {0DF44EAA-FF21-4412-828E-260A8728E7F1} Taskbar {38A98528-6CBF-4CA9-8DC0-B…

OLEScriptキーを持つCLSIDキーエントリの一覧

Windows 10環境のOLEScriptキーを持つCLSIDキーエントリの一覧です。 CLSID 表示名 ProgID InProcServer32 {cc5bbec3-db4a-4bed-828d-08d78ee3e1ed} JScript Compact Profile (ECMA 327) JScript.Compact %WINDIR%\System32\jscript.dll {16d51579-a30b-4c8b…

HKEY_CLASSES_ROOTに登録されたCLSIDのサブキー一覧

かなり古いPCでHKEY_CLASSES_ROOTに登録されたCLSIDのサブキーの一覧です。出現回数が5回未満のサブキーは除外しています。 回数 サブキー 5000回以上 InprocServer32 5000回未満100回以上 ProgID、VersionIndependentProgID、TypeLib、Version、Implemented…

C# Dictionaryでキーの大文字小文字を同一視する

C#

本文 Dictionaryクラスはコンストラクタの引数に次のいずれかを与えることでキーの大文字小文字の区別を指定できます。区別の方法は与えた変数により異なります(リファレンス参照)。 StringComparer.OrdinalIgnoreCase StringComparer.InvariantCultureIgn…

SourceBrowser:.NET Framework、Roslyn、.NET Core、Azure

C#

対象 URL 備考 .NET Framework https://referencesource.microsoft.com/ .NET Frameworkは.NET Coreに統合された。 Roslyn http://sourceroslyn.io/ .NET Core https://source.dot.net/ Azure http://sourcebrowser.azurewebsites.net/ SourceBrowser - GitH…

C# PEファイルのMS-DOSヘッダとNTヘッダのシグネチャをメモリマップトファイルで読み込む

C#

PEファイルのMS-DOSヘッダ(IMAGE_DOS_HEADER)とNTヘッダ(IMAGE_NT_HEADERS)のシグネチャをメモリマップトファイルで読み込むサンプルコードです。IMAGE_DOS_HEADERは固定長配列を含むため、マーシャリングとGCHandleを利用しています。IMAGE_NT_HEADERS…

C# DOS MZファイルヘッダー(IMAGE_DOS_HEADER)のe_lfanewの幅広さ

Windows 10の実行ファイルはイメージファイルの一種であり、普通はPEファイルフォーマットを持ちます。PEファイルフォーマットではファイルの先頭にMS-DOSと共通のMZファイルヘッダー(IMAGE_DOS_HEADER構造体)、続けてMS-DOS Real Modeスタブプログラムを…

C# Enumerable.ToLookup(LINQ)で配列やリスト(IEnumerable)を条件ごとに分ける

C#

C#ではEnumerable.ToLookup(LINQ)を使うことで配列やリスト(IEnumerable)を条件ごとに分類できます。ToDictionaryと組み合わせることで辞書も作成できます。 模式図: Enumerable.ToLookup:■□■□○ → ■■、□□、○ ■□○:分類された要素(キーセレクタが同じ…

C# Windows 10のレジストリに登録されたAppID情報を取得するクラス

動作確認環境:C# 8(.NET Core 3.1)、9(.NET 5.0) レジストリからHKEY_CLASSES_ROOT\AppIDキーの情報を取得する。 C#でWindows 10のレジストリに登録されたAppID情報を取得するクラスです。レジストリから値の取得は実装していますが、取得した値の整形…

C# Windows 10のレジストリを直接参照して実行ファイル名の登録されたAppIDとその名前を取得するコード

動作確認環境:Windows 10、C#、.NET Core 3.1 レジストリを直接参照して実行ファイル名の登録されたAppIDとその名前を取得するコードです。 using System; using System.Collections.Generic; using Microsoft.Win32; class Program { static void Main() {…

C# Windows 10のレジストリを直接参照して登録アプリケーションのSupportedTypesを取得するコード

動作確認環境:Windows 10、C#、.NET Core 3.1 レジストリを直接参照して登録アプリケーションのSupportedTypesを取得するコードです。shlwapi.dllのIQueryAssociationsは列挙に非対応なので、一覧を取得する場合はこのように直接取得するしかないかもしれま…

C# Windows 10のレジストリキーハンドル情報を取得するコードとクラス

C#でWindows 10のレジストリキーハンドルの情報を取得するには非公開のWin32 API NtQueryKeyが使用できます。NtQueryKey関数に渡す構造体は可変長配列を含みますが、バイト配列で受け取ってSystem.BitConverter、System.TextEncoding.Unicode.GetStringを使…