.NET

【C#】ジェネリックが推論できないコード2選

C# の型推論は大抵の場合型を推定してくれてジェネリックの型も推論で省略することができます。 特にジェネリックパラメータを推論によって省略できるため、メソッド使用時に型を書く手間がなくなり、コードの見た目もかなりすっきりできます。が、ごく一部…

【Unity】デリゲートを指定するときにGCAllocを減らす

あるメソッドの引数にデリゲートが必要な場合、GC Allocationを減らす方法の紹介です。 以下状況での GC Alloc が発生する話になります。 public static class SampleUtility { // デリゲートを引数に取るメソッド public int Execute(Action<int> method) { ... </int>…

【C#】2進数を4桁ごとに区切って表示する

ある整数を2進数に変換し4桁ごとに区切り文字を入れる方法の紹介です。 // こんな数値を uint value = 0xCACAEFEF; // こんな風に文字列に変換する 1100 1010 1100 1010 1110 1111 1110 1111 Unity 上での使用を想定して GCAlloc が最小となる & そこそこ高…

【Unity】放置ゲームやクリッカーゲームに出てくる単位を表現する

タイトルの通り、徐々に扱う数値が大きくなってくゲームを「インクリメンタルゲーム」と言ったりします。このジャンルは色々と呼び方があるようで「放置ゲー/放置ゲーム」や「クリッカーゲーム」(クッキークリッカーが特に有名です)などの呼び方もあります…

VisualStudioとC#バージョンの関係性

だんだん状況が変わってきたのでメモ。 2023年3月現在、.NET のバージョンと C#、VisualStudio の対応関係は以下のような関係性になっています。 .NET ver. C# ver. VisualStudio .NET 7 C# 11 2022 .NET 6 C# 10 2022 .NET 5 C# 9.0 2022, 2019 .NET Core 3…

【C#】文字列から一部分を取り出す(Substringの使い方)

C# で文字列から一部分を取り出す処理は Substring メソッドを使用します。 この記事では、SubString の使い方と注意点、便利な使い方を紹介したいと思います。 確認環境 .NET 6 VisualStudio 2022 Windows 11 この記事は C# であればどのバージョンでも使用…

【C#】ターゲットOSがWindowsの時のOSバージョン

プロジェクトのプロパティで「ターゲットOS」を Windows にした時に選択肢に出てくるバージョンの説明です。 実際これに具体的なバージョンを指定して何が変わるのかちょっとわからないですが、、、 「ターゲット OS バージョン」と「サポートされている OS …

【C#】.NET6のConfigureKestrelどこいった?

.NET 5 → 6でホストの実装スタイルが変わりました。 今までやっていたあの設定はどこでできる?みたいな状態なので少しまとめてみました。 MagicOnion + IPC の設定で UseKestrel していましたが設定どこ行った…? // .NET 5 internal partial class Program…

【C#】HostBuilderでIConfigurationを取得する

CreateDefaultBuilder とかで作成した IHost なインスタンスのどこで IConfiguration を受け取れるかは以下の通りです。 確認環境 .NET 6 VisualStudio 2022 IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices(services => { services.AddHo…

【C#】タスクトレイに常駐するアプリの実装Tips

Windows Forms で作成したソフトをタスクトレイに常駐させてメインウインドウを表示しないときの実装方法の紹介です。 条件は以下の通り。 Windows Forms タスクバーにアイコンを表示しない タスクトレイの常駐させる 起動したときにウインドウ(フォーム)を…

【C#】MagicOnionの例外処理

サーバーで発生した例外はクライアントに RpcException として通知される。 基本の動作 // サーバー側 public class SampleService : ServiceBase<ISample>, ISample { public async UnaryResult<int> SumAsync(int x, int y) { throw new NotImplementedException("oh!");</int></isample>…

【C++/CLI】System::String^をdouble/intに変換する

まず前提は以下の通り。 // これは .NETの型 System::String^ str = "10;" // こっちは .NET/C++(CLI)共通で使える型 double d = 0; 変換に使うメソッドはいくつかあるのでそれぞれの使い方です。 System::String^ str = "10"; double d = 0; int i = 0; // …

【UniRx】MessageBrokerの使い方

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

【Unity】タッチ処理の実装(エディタ、実機両対応)

【Unity】スマホとPCの両方のタッチに対応する PCのクリックとスマホのタッチだと実は検出の実装方法が違うとのことで調べてみました。スマホ向けアプリを製作していてエディター上で動作確認しているシーンを想定しています。 // ★PC // 左クリックが押し込…

【C#】.NET CoreでMagicOnion+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 が標準でサポートされているので、各コントロール…

PowerShellからC#を実行する

PowerShell 構文を使って .NET のライブラリ使いながらスクリプト書と多少面倒な時があり C# で書けないかと思ったのでそのやり方の紹介です。PowerShell の中で C# のコードを書いてスクリプトを実行する方法の紹介です。 また別のところで作成した .NET の…

【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 でフォルダ…