C#, C♯, C#相談室 Part98 (518レス)
C#, C♯, C#相談室 Part98 http://mevius.5ch.net/test/read.cgi/tech/1719656321/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
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
338: デフォルトの名無しさん (ワッチョイ 27d7-kxmC) [sage] 2025/04/16(水) 15:31:47.59 ID:yzNZC+ym0 BOOL TestFunc(DWORD dwType, LPBYTE pBuffer, LPDWORD pcbBufSize); dwType:欲しいデータのタイプコード pBuffer:要求したデータを入れるバッファへのポインタ pcbBufSize:pBufferが指すバッファのサイズ 例えば↑のような関数をエクスポートしてるアンマネージDLLがあって DllImportする時のプロトタイプ宣言ってどう書いたらいいんでしょ? http://mevius.5ch.net/test/read.cgi/tech/1719656321/338
339: デフォルトの名無しさん (ワッチョイ 27d7-kxmC) [sage] 2025/04/16(水) 15:33:52.84 ID:yzNZC+ym0 LPDWORDはref uintでいいのかなと思うけど LPBYTEとか、それこそLPVOIDだのハンドル系受け取る引数なんかはどう宣言したものかよく解らなくて http://mevius.5ch.net/test/read.cgi/tech/1719656321/339
340: デフォルトの名無しさん (ワッチョイ bfbc-6F/1) [sage] 2025/04/16(水) 19:05:55.86 ID:HaWtxdw70 典型的にはこう bool TestFunc(uint dwType, byte[] pBuffer, out uint pcbBufSize); ref/outで宣言すると使いやすいけどNULLを渡せなくなるってのが問題になったりすることもある ケースバイケースなので一概には言えない ポインタが絡むなら誰がメモリ確保して誰がどうやって解放するのかを把握してないといけない場合もある http://mevius.5ch.net/test/read.cgi/tech/1719656321/340
341: デフォルトの名無しさん (オイコラミネオ MM0b-z3tz) [sage] 2025/04/16(水) 19:58:01.06 ID:VD2CYluqM 第三引数は普通はoutじゃないきがするけど http://mevius.5ch.net/test/read.cgi/tech/1719656321/341
342: デフォルトの名無しさん (ブーイモ MM8f-xKSY) [sage] 2025/04/16(水) 20:27:15.14 ID:qW3EbLcWM outだと呼び出し元からバッファサイズを渡せないな http://mevius.5ch.net/test/read.cgi/tech/1719656321/342
343: デフォルトの名無しさん (ワッチョイ 7f10-z3tz) [sage] 2025/04/16(水) 20:47:35.76 ID:JiAmFx7+0 refじゃあかんの? http://mevius.5ch.net/test/read.cgi/tech/1719656321/343
344: デフォルトの名無しさん (ワッチョイ 27d7-kxmC) [sage] 2025/04/16(水) 20:48:46.57 ID:yzNZC+ym0 >>340 おぉ、ありがとう ちょっとそれ元に弄ってみるます http://mevius.5ch.net/test/read.cgi/tech/1719656321/344
345: デフォルトの名無しさん (ワッチョイ ed96-VXNn) [] 2025/04/20(日) 10:42:31.48 ID:T4EZ0xEH0 refとかout使うと機械語的にはゴミラッパーが生成される ついでにboolも実はネイティブ型ではないので同様にゴミが生成される 多少可読性や安全性を犠牲にして良いなら int TestFunc(uint dwType, byte* pBuffer, uint* pcbBufSize)とすればC/C++と遜色ない機械語になる 戻り値はintなので != 0としてbool判定をする手間がかかるけどね ついでに.NETCore系統で且つ内部でIOなどを行わずに計算量が少なく割とすぐ戻る事が確定している場合は[DllImport("native.dll"), SuppressGCTransition]とすると尚良し http://mevius.5ch.net/test/read.cgi/tech/1719656321/345
346: デフォルトの名無しさん (ワッチョイ ed96-VXNn) [] 2025/04/20(日) 10:47:34.35 ID:T4EZ0xEH0 もしネイティブ側の戻り値がBOOLではなくboolならC#側はbyteにすればいい boolって実は結構罠だからな http://mevius.5ch.net/test/read.cgi/tech/1719656321/346
347: デフォルトの名無しさん (ワッチョイ 4954-EnZh) [sage] 2025/04/21(月) 11:37:03.90 ID:ed9AfVbw0 CharGPTの回答 WinAPI型名 意味 C# 対応型 備考・使い方例 BYTE 8ビット符号なし整数 byte 0〜255 WORD 16ビット符号なし整数 ushort 0〜65535 DWORD 32ビット符号なし整数 uint よく使われる LONG 32ビット符号付き整数 int 一部APIでは戻り値で使用 ULONG 32ビット符号なし整数 uint DWORDと同義扱いされることあり BOOL 論理値(実際はint型) bool または int C#では [MarshalAs(UnmanagedType.Bool)] を使うと便利 LPSTR ANSI文字列へのポインタ string (MarshalAs(UnmanagedType.LPStr)) LPCWSTR Unicode文字列定数へのポインタ string (MarshalAs(UnmanagedType.LPWStr)) 通常はこれを使う LPBYTE BYTEへのポインタ IntPtr / byte[] / byte* C#で配列やポインタとして使う LPDWORD DWORDへのポインタ ref uint / out uint / IntPtr APIによって使い分け HANDLE 汎用ハンドル IntPtr ハンドルは全部 IntPtr PVOID/LPVOID 任意のポインタ IntPtr Voidポインタの表現 CHAR 1バイト文字 byte(ANSI)/ char(Unicode) ANSI文字列なら byte TCHAR Unicode/ANSI切り替え可能文字型 char または string Unicode前提なら char/string http://mevius.5ch.net/test/read.cgi/tech/1719656321/347
348: デフォルトの名無しさん (ワッチョイ 6610-h0BB) [sage] 2025/04/21(月) 14:43:06.51 ID:AUqiwuPT0 何のためのVOIDポインタかで変わるしIntPtrで良いもんでもないわ まぁなんだ、CharGPTなんて言うアホは黙っとけw http://mevius.5ch.net/test/read.cgi/tech/1719656321/348
349: デフォルトの名無しさん (ワッチョイ a6ce-i6bQ) [] 2025/04/22(火) 19:34:21.37 ID:rMo0RJWh0 Copilot「僕の出番ですね!」 http://mevius.5ch.net/test/read.cgi/tech/1719656321/349
350: デフォルトの名無しさん (ワッチョイ 79d7-vVAN) [sage] 2025/04/23(水) 08:49:37.84 ID:eLYGqJZZ0 去ね http://mevius.5ch.net/test/read.cgi/tech/1719656321/350
351: デフォルトの名無しさん (スフッ Sd0a-NF34) [] 2025/04/23(水) 12:17:26.63 ID:snQ3Sxp8d wchar : 「神は我を見放したのか」 http://mevius.5ch.net/test/read.cgi/tech/1719656321/351
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 167 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.019s