C#, C♯, C#相談室 Part98 (518レス)
C#, C♯, C#相談室 Part98 http://mevius.5ch.net/test/read.cgi/tech/1719656321/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
308: デフォルトの名無しさん (ワッチョイ 3ec0-m72+) [sage] 2025/01/01(水) 16:07:11.80 ID:nGCOTvnw0 だよね ありがとう http://mevius.5ch.net/test/read.cgi/tech/1719656321/308
309: デフォルトの名無しさん (ワッチョイ 3ec0-m72+) [sage] 2025/01/01(水) 16:23:43.79 ID:nGCOTvnw0 確かにジェネリクスでstruct制約付けたらボックス化回避できそう ありがとう public TEnum ConvertToEnum<TStruct, TEnum>(TStruct value) where TStruct : struct where TEnum : Enum { if (!Enum.IsDefined(typeof(TEnum), value)) throw new ArgumentException(); return Unsafe.As<TStruct, TEnum>(ref value); } http://mevius.5ch.net/test/read.cgi/tech/1719656321/309
310: デフォルトの名無しさん (ワッチョイ 63eb-UqtM) [] 2025/01/01(水) 22:57:38.89 ID:tBHA6FMH0 JetbrainsやILSpyでIL見てboxあるかどうかみればいいんじゃね http://mevius.5ch.net/test/read.cgi/tech/1719656321/310
311: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/01/31(金) 11:32:40.83 ID:jXb+sjQI0 ハック的なことなんだけどインスタンスのオブジェクトヘッダに埋め込まれるクラスハンドルへのポインタ?をインスタンス無しで得る方法って無いかな typeof(MyClass)ってすると正にそのポインタが「mov rcx, 7FFB716DE758 -> call clrのtype取得関数」って感じのアセンブラが生成される訳だけど、その7FFB716DE758を得たいんだよね インスタンスがあればUnsafeライブラリ用いて簡単に得られるのだけど http://mevius.5ch.net/test/read.cgi/tech/1719656321/311
312: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/01/31(金) 11:34:05.08 ID:jXb+sjQI0 文章修正してたら日本語おかしくなったけどもし知ってる方いたらヒントでも何でも教えていただきたい http://mevius.5ch.net/test/read.cgi/tech/1719656321/312
313: デフォルトの名無しさん (ワッチョイ 9714-natb) [sage] 2025/01/31(金) 12:00:57.31 ID:ejyfLYzx0 GetTypeで得られるものとは違うわけ? http://mevius.5ch.net/test/read.cgi/tech/1719656321/313
314: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/01/31(金) 12:51:25.22 ID:jXb+sjQI0 >>313 GetTypeやtypeofで得られるものはあくまでもType型のマネージドインスタンスだから全く違う だけど逆アセをするとtypeof()時には即値でハンドルへのポインタ?がアセンブラコードとして埋め込まれてるので内部的にはめちゃくちゃ簡単に得る方法があるはずなんだよね http://mevius.5ch.net/test/read.cgi/tech/1719656321/314
315: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/01/31(金) 14:52:24.28 ID:jXb+sjQI0 一応自己解決だけどGetTypeやtypeofで得られたTypeインスタンスから「type.TypeHandle.Value」で希望のものは得られた 本来即値で得られるはずなのに冗長でもやもやはするが http://mevius.5ch.net/test/read.cgi/tech/1719656321/315
316: デフォルトの名無しさん (ワッチョイ 1a9d-natb) [sage] 2025/01/31(金) 15:09:15.71 ID:gpRv5mHv0 ChatGPTに聞いたら同じ答えが返ってきたけどRuntimeTypeHandle.Valueは環境によってメソッドテーブルへのポインタじゃなくEETypeへのポインタや実装依存のメタデータへのポインタになる場合もあるから自分で確認しろよとのこと http://mevius.5ch.net/test/read.cgi/tech/1719656321/316
317: デフォルトの名無しさん (ワッチョイ 4e10-EVp+) [sage] 2025/02/01(土) 06:49:44.36 ID:LNgv56j/0 そらJITなんだから・・・ http://mevius.5ch.net/test/read.cgi/tech/1719656321/317
318: デフォルトの名無しさん (ワッチョイ 1a9d-natb) [sage] 2025/02/01(土) 10:13:37.11 ID:m26c//aC0 いやJITは関係ないぞ http://mevius.5ch.net/test/read.cgi/tech/1719656321/318
319: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/02/01(土) 11:06:41.29 ID:dQW8A9nv0 JITだろうが何だろうがconst intなんかは即値で埋め込まれるしね だからクラス名.TypeHandleValueみたいなconst持っててくれたら嬉しいんだけど需要ほぼゼロすぎるか http://mevius.5ch.net/test/read.cgi/tech/1719656321/319
320: デフォルトの名無しさん (ワッチョイ 1a9d-natb) [sage] 2025/02/01(土) 12:12:47.05 ID:m26c//aC0 ん?即値で得られない理由の話だったか そっちならJIT関係あるわな http://mevius.5ch.net/test/read.cgi/tech/1719656321/320
321: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/02/01(土) 12:17:46.65 ID:dQW8A9nv0 いや関係ないよ なぜなら逆アセすれば分かるけど思いっきりレジスタ長以下のconst同様の挙動を見せてるからね typeof時にね http://mevius.5ch.net/test/read.cgi/tech/1719656321/321
322: デフォルトの名無しさん (ワッチョイ 17d7-EVp+) [sage] 2025/02/01(土) 12:48:59.04 ID:MtSj47O+0 逆アセw http://mevius.5ch.net/test/read.cgi/tech/1719656321/322
323: デフォルトの名無しさん (ワッチョイ 4e10-EVp+) [sage] 2025/02/01(土) 12:53:04.51 ID:LNgv56j/0 アドレスとかプロセス起動のたびに変わることは無いんだっけ? http://mevius.5ch.net/test/read.cgi/tech/1719656321/323
324: デフォルトの名無しさん (ワッチョイ 9a8b-IJXt) [sage] 2025/02/01(土) 12:59:03.20 ID:dQW8A9nv0 >>323 .NETの場合は当然変わるしネイティブでも設定次第では変わり得る でもそもそもC#やJavaは実行時にその都度機械語を組み立てて行く訳だから、であればその都度埋め込めばいいだけの話 http://mevius.5ch.net/test/read.cgi/tech/1719656321/324
325: デフォルトの名無しさん (ワッチョイ 4e10-EVp+) [sage] 2025/02/01(土) 13:11:42.17 ID:LNgv56j/0 なら結局、ユーザークラスじゃ都度変わりうるってことじゃ? http://mevius.5ch.net/test/read.cgi/tech/1719656321/325
326: デフォルトの名無しさん (ワッチョイ a36b-natb) [sage] 2025/02/01(土) 15:14:32.83 ID:XDtywhx90 >>321 それはJITやAOT後のものを見てるからでしょ JIT/AOT時に異なる相対アドレスに配置できる余地を残すためにC#/ILの段階では固定しない http://mevius.5ch.net/test/read.cgi/tech/1719656321/326
327: デフォルトの名無しさん (ワッチョイ 3f79-sZTl) [sage] 2025/02/02(日) 01:00:15.78 ID:U03i5Xdj0 ILの段階で定数になるなら決め撃ちで問題ないだろ http://mevius.5ch.net/test/read.cgi/tech/1719656321/327
328: デフォルトの名無しさん (ワッチョイ 7f10-cJwu) [sage] 2025/02/02(日) 06:57:31.12 ID:VLFyjNJe0 ユーザークラスがILの段階で決め打ちになるわけないだろ http://mevius.5ch.net/test/read.cgi/tech/1719656321/328
329: デフォルトの名無しさん (ワッチョイ 3f8b-YkUZ) [sage] 2025/02/02(日) 10:55:04.54 ID:NGhOMzti0 ユーザークラスだろうが何だろうが別に関係ないし IL段階で定数になる必要もなくて事実として実行時に機械語になるタイミングで定数化されるんだよ プログラマがその定数にアクセスする手段がないだけで http://mevius.5ch.net/test/read.cgi/tech/1719656321/329
330: デフォルトの名無しさん (ワッチョイ 0fd7-cJwu) [sage] 2025/02/02(日) 11:18:20.90 ID:RNSPFW0b0 実行時にならんと決まらんものは定数じゃねぇ http://mevius.5ch.net/test/read.cgi/tech/1719656321/330
331: デフォルトの名無しさん (ワッチョイ 3f8b-YkUZ) [sage] 2025/02/02(日) 12:43:09.18 ID:NGhOMzti0 定数ってか再三言ってるけど即値だな http://mevius.5ch.net/test/read.cgi/tech/1719656321/331
332: デフォルトの名無しさん (ベーイモ MM8f-VqRJ) [sage] 2025/02/03(月) 22:15:38.62 ID:EtXs2rHFM インスタンスの型の厳密なチェック typeof (X) == x.GetType() やジェネリック型のチェック typeof (T) == typeof (X) はJITで最適化されるから、 質問者のケースがもしこれらに該当するなら変なハックは必要ない http://mevius.5ch.net/test/read.cgi/tech/1719656321/332
333: デフォルトの名無しさん (ワッチョイ 5f90-YkUp) [sage] 2025/04/14(月) 17:39:25.74 ID:XKwEHxpo0 Task<T>を返す非同期メソッドをUIスレッドで呼び出して結果を取得したいのですがどうすればいいのでしょうか? ConfigureAwait(false)の後やTask.Runでスレッドプール上?で実行されてる コード内からメソッドをUIスレッドで呼んで結果を取得したいのです http://mevius.5ch.net/test/read.cgi/tech/1719656321/333
334: デフォルトの名無しさん (ワッチョイ bfbc-6F/1) [sage] 2025/04/16(水) 05:53:28.46 ID:HaWtxdw70 イマイチ質問が把握できないがこういうことか? UIスレッドでTaskScheduler.FromCurrentSynchronizationContext();してTaskSchedulerを確保しておく UIスレッドで実行したいメソッドは上記TaskSchedulerを使ってStartするTaskとして実行する public Form1() { this.Button1.Click += ExecuteAsync; } async void ExecuteAsync(object? sender, EventArgs e) { var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); await Task.Run(async () => { using var logger = new Logger("Task"); var task = Task.Factory.StartNew<Task>(() => SetTextAsync(), CancellationToken.None, CreationOptions.None, scheduler); await task; await task.Result; }); } async Task SetTextAsync() { await Task.Delay(1000); this.Text = DateTime.Now.ToString("HH:mm:ss"); } http://mevius.5ch.net/test/read.cgi/tech/1719656321/334
335: デフォルトの名無しさん (ワッチョイ bfbc-6F/1) [sage] 2025/04/16(水) 05:58:12.67 ID:HaWtxdw70 あ、TaskCreationOptionsのTaskが抜けてる… async Task SetTextAsync()の代わりにasync Task<string> GetTextAsync()だったら StartNew<Task<string>>にしてvar text = await task.Resultすればいい http://mevius.5ch.net/test/read.cgi/tech/1719656321/335
336: デフォルトの名無しさん (ワッチョイ 5f90-YkUp) [sage] 2025/04/16(水) 07:31:16.54 ID:QZV5gxIh0 ああ、ありがとうごいます それっぽいです 要はスレッドプールなどで実行されてるメソッドから 途中でダイアログなどを出してユーザのアクションの結果で更に処理を 進めるかキャンセルするかを決定したかったにです 同期コンテキストは調べたのですがこのPostなんたらじゃできないなと.. TaskSchedulerの方から攻めるのですね ありがとうございます http://mevius.5ch.net/test/read.cgi/tech/1719656321/336
337: デフォルトの名無しさん (ワッチョイ 5f90-YkUp) [sage] 2025/04/16(水) 07:41:21.34 ID:QZV5gxIh0 ボタンなど押して非同期メソッドを呼び出す この時、非同期メソッドには介入が必要な時に呼び出される非同期コールバックを渡せるようにする 呼び出し側で、非同期コールバックとして ダイアログなどをだしたりする ダイアログの表示などはUIスレッド実行したかった こんな感じでした http://mevius.5ch.net/test/read.cgi/tech/1719656321/337
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 181 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.011s