.NET Core

【UniRx】MessageBrokerの使い方

UniRx に付属しているプロセス内の簡易型の広域メッセージ送受信ライブラリのMessageBroker の使い方の紹介です。 最近は MessageBroker の代わりによりモダンな MessagePipe というライブラリもリリースされていますが、Unity で単一シーン、簡単な UI しか…

【C#】MagicOnion(gRPC)+IPC通信

タイトルの通り gRPC のライブラリである MagicOnion を使いつつ IPC(プロセス間) 通信したいと思います。 ちなみに、MagicOnion を使うと WCF を使った RPC の API 呼び出しのワークフローと極めて似た感じで実装できるようになります。特に proto からの型…

【Unity】Vector3(構造体)に自分自身の値を変更する拡張メソッドを定義する

Unity の Vector3 (Vector2 など構造体)に自分自身を書き換える処理を追加する拡張メソッドの定義方法の紹介です。 前提として以下のように Vector3 に拡張メソッドを定義して値を変更しようとしても値は変わらない事を確認します。 public static class Vec…

【Unity】メモリの改ざんを防ぐ機能を実装する

アプリなどでメモリ上に保持してる値って外部ツールで割と簡単に読み取ったり変更されてしまうんですよね。変更したときにどのアドレスに保存されているみたいな位置を特定されると実行中に値を書き換えられてしまいます。 そこでこれらの行為を防止するため…

【C#】メモリにファイルの内容を展開せずにAESで暗号化する

以前にデータを AES 暗号化する方法を紹介しましたが、実装例が何らかのデータをアプリのメモリ上に byte 配列として全部に読み取った内容を展開してから AES 暗号化する方法でした。 この方法だと、例えば 1GB のファイルを暗号化しようとすると1GBぶん全て…

【Unity】StreamingAssetsからデータを読み取る

Unity の StreamingAssets に置いたファイルを読み取る実装例です。 Android と WebGL は特別な処理が必要だそうで UnityWebRequest を使ってデータを読み取るようです。それ以外のプラットフォーム(iOS, Windows, デバッグ中のエディタ上)では普通にファ…

【Unity】パララックス(多重スクロール)を実装する

Unityの2Dの表現で視差の効果を使ったパララックスのスクロール(Parallax)を実装例を紹介したいと思います。かつてレトロゲームの背景スクロールでよくありましたね。 この表現方法は、スクロールの速度が奥のほうがゆっくりで手前ほど早くスクロールする…

JAN,FEB/MAR... 英語の月の略語

英語で各月の略号は3文字の短い形式があります。 以下表の通り各月は3文字の大文字で表されます。 月 英略 英 01月 JAN January 02月 FEB February 03月 MAR March 04月 APR April 05月 MAY May 06月 JUN June 07月 JUL July 08月 AUG August 09月 SEP Septe…

ObservableCollectionの要素の変更通知を受け取る

ObservableCollection でコレクションに格納されている要素の変更通知を受け取る方法です。 単純に Add されたときに要素に PropertyChanged を設定するだけでは全く考慮が足りないため現実的に子要素から通知を受け取る実装を考えたいと思います。 確認環境…

ObservableCollectionの変更イベントの挙動を確認する

ObservableCollection は List に似た機能を持ってるクラスで、要素を追加したり削除したときにイベントが発生する機能を持つクラスです。この発生するイベントは、WPF とか UWP みたいな XAML 環境は MVVM が標準でサポートされているので、各コントロール…

【C#】リフレクションでオブジェクトの値を列挙する

C# のリフレクションという機能を使用して任意の型の内容、public なフィールドとプロパティをすべて列挙してみようと思います。 リフレクションを使用するので、特定の型のメンバーを認識したうえでフィールドやプロパティの名前を指定して列挙するのではな…

【C#】SQLiteでクエリー結果の列名を取得する

SQLを発行した結果の列名を取得する方法です。 DbDataRecordからSchemaInfoを取得して列名と型を取得しようと思います。 C#でSQLをダイレクトに実行する場合、コネクションを取得しコマンドを発行した後、SqliteDataReader で結果を読み取るのが一般的です。…

ラムダ式はデリゲート型ではないためDelegate型に変換できません

Windows フォームなんかの古いライブラリで引数が Delegate のメソッドにラムダ式を書いたりすると「ラムダ式 はデリゲート型ではないため、'Delegate' 型に変換できません。」と怒られます。 // こんな風に書くと怒られる public partial class FormMain : …

【C#】ファイルダウンロード時の連番のファイル名を作成する

よくブラウザでファイルをダウンロードしたときに既にそのファイルがあった場合、末尾に(1)、(2)...という風に連番が付いた別のファイルが作成されます。 // こんな風に連番が自動的に作成される Sample.zip Sample (1).zip Sample (2).zip これを C# で同じ…

【C#】再帰構造を別の再帰構造に変換する

あるオブジェクトが自分自身をメンバーに持つ、子要素を無限に繰り返して持てる構造を再帰構造とか再帰データと言います。 // 自分自身をメンバーにもつ構造 ClassA + ClassA + ClassA + null // 終端はnull こういう再帰構造をもつオブジェクトを別の再帰構…

【C#】ZipArchiveでフォルダを扱う

.NET の Zip を扱うための ZipArchive クラスってファイルを zip に追加するための「CreateEntryFromFile」はありますが、フォルダを扱う「CreateEntryFromDireocty」みたいな操作はありません。 普通に使用したらすぐ必要になるので、ZipArchive でフォルダ…

【ASP.NET】大容量ファイルのダウンロード&C#での保存方法

C# の ASP.NET Web API で大容量ファイルをダウンロードする方法です。 ファイルの内容全てbyte配列としてメモリ上に展開しクライアントに応答するとファイルの内容分のメモリがリクエストごとに必要になります。ある程度のサイズなら問題にならない事もあり…

明示的なインターフェイスの実装の使いどころ

C# には「明示的なインターフェースの実装」という言語仕様があります。 使い方 使い方はシンプルに以下の通り。 同じメソッドを持つ複数のインターフェースの実装を別々に実装することができます。 // 同じ名前を持つ2つのインターフェース public interfac…

【C#】TimeSpanの書式指定方法

System.TimeSpan 型の書式指定の方法です。 DateTime 型とは ToString の書式の指定が異なるので同じ感覚で記述すると以下の「System.FormatException」が発生します。 // こんな感じのエラーが出る 'span.ToString(@"dd\d\a\y mm\:ss\.fff")' は型 'System.…

TweenCancelBehaviourの指定ごとの挙動

DOTween + UniTask 環境で ToUniTask に渡す TweenCancelBehaviour の識別子ごとの挙動の説明です。 前提として、DOTween を UniTask で await するときに挙動を指定する ToUniTask メソッドには TweenCancelBehaviour を渡すことでキャンセル時の挙動を指定…

【C#/Unity】A*(A-Star)で経路探索を実装する

Unity の場合、3D, 2D ともに NavMesh とエージェントを使用すれば経路探索を自力で実装する機会はないかもしれませんが、経路探索をA*(A-Star)というアルゴリズムを自分で実装する場合の考え方と実装の紹介をしたいと思います。 グリッドベースの A* の経路…

【C#】Tupleで値を入れ替える時の処理速度

かなり前に Tuple で値を入れ替える方法を紹介しましたが、普通に入れ替えるのと、Tuple を使用して値を入れ替えるので処理速度がどの程度違うのか確認します。 takap-tech.com 確認環境 確認環境は以下の通りです。 .NET6 + C# 10.0 VisualStudio 2022 Wind…

【C#】Timerで1日1回任意の時間に処理を実行する

C# で Tiemr を使って1日1回任意の時間に処理を実行する方法を紹介したと思います。 タスクスケジューラーにC#のプログラムを登録すれば、特別な実装をしなくてもOSが自動で処理を起動してくれるます。が、その手段が取れない or 長時間起動しているプロセス…

【C#】コンソールアプリでMessagePipeを使う

前回コンソールアプリ上で「Microsoft.Extensions.DependencyInjection」を使用した DI を環境を構築しましたが、今回は、この環境を使って Cysharp がリリースしているメッセージングライブラリの「MessagePipe」をコンソールアプリに導入して動作を確認し…

【C#】コンソールアプリでDIを使う

.NET 6 でコンソールアプリに DI (=Dependency Injection) 環境を作成して、オブジェクトに依存関係を注入するところまでを確認したいと思います。 使用するライブラリは、「Microsoft.Extensions.DependencyInjection」です。 確認環境 動作確認環境は以下…

【C#】コンソールアプリでHostBuilderを使う

ASP.NET 系のテンプレートで作成すると何も考えずとも汎用ホスト(=Generic Host) が使用可能、つまり、HostBuilder が利用可能な状態から始まりますが、コンソールアプリから始めると何も存在しないため HostBuilder が宣言しても見つからないため意外とどう…

【C#】連続で処理が失敗した時に何度も同じような処理をしない

例えば定周期処理などで、エラーが出ても処理を継続するような場合に、最初の一回は例外処理を行うけど、処理が連続で失敗した場合2回目以降は、処理を行わないようにする実装パターンの紹介です。 この仕組みを使用して実装例ではログを何度も出力しないよ…

ASP.NET WebAPIでURLパラメーターを受け取る

URLパラメータ*1は、URLの最後に以下のように加えられた変数を指します。 https://localhost:8080/app/v1/data?code=100 この「code=100」の部分を ASP.NET Core Web API で受け取る方法です。 確認環境 .NET 6 + ASP.NET Core Web API VisualStudio 2022 Wi…

【C#】ViewModelの実装をスニペットで軽減する

WPF/UWP などの XAML 系実装で使用する ViewModel は OSS(Livet, Prism ReactiveProperty) などを使用しない場合、INotifyPropertyChanged 周りの実装が冗長で、繰り返しが面倒なので軽減策の紹介したいと思います。 アプローチ方法は以下の通りです。 共通…

【C#】WMIでOSのメモリ使用量を取得する

WMI(Windows Management Infrastructure)という機能を使うとWindowsのシステムの各種情報を取得することができます。今回はこの機能を使用して 確認環境 Windows10 VisualStudio 2019 .NET Framework 4.7.2 / .NET 5 プロジェクトの設定 WMI の機能を使用…