C#, C♯, C#相談室 Part98 (518レス)
上下前次1-新
308: (ワッチョイ 3ec0-m72+) 01/01(水)16:07 ID:nGCOTvnw0(2/3) AAS
だよね ありがとう
309: (ワッチョイ 3ec0-m72+) 01/01(水)16:23 ID:nGCOTvnw0(3/3) AAS
確かにジェネリクスで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);
}
310: (ワッチョイ 63eb-UqtM) 01/01(水)22:57 ID:tBHA6FMH0(1) AAS
JetbrainsやILSpyでIL見てboxあるかどうかみればいいんじゃね
311: (ワッチョイ 9a8b-IJXt) 01/31(金)11:32 ID:jXb+sjQI0(1/4) AAS
ハック的なことなんだけどインスタンスのオブジェクトヘッダに埋め込まれるクラスハンドルへのポインタ?をインスタンス無しで得る方法って無いかな
typeof(MyClass)ってすると正にそのポインタが「mov rcx, 7FFB716DE758 -> call clrのtype取得関数」って感じのアセンブラが生成される訳だけど、その7FFB716DE758を得たいんだよね
インスタンスがあればUnsafeライブラリ用いて簡単に得られるのだけど
312: (ワッチョイ 9a8b-IJXt) 01/31(金)11:34 ID:jXb+sjQI0(2/4) AAS
文章修正してたら日本語おかしくなったけどもし知ってる方いたらヒントでも何でも教えていただきたい
313(1): (ワッチョイ 9714-natb) 01/31(金)12:00 ID:ejyfLYzx0(1) AAS
GetTypeで得られるものとは違うわけ?
314: (ワッチョイ 9a8b-IJXt) 01/31(金)12:51 ID:jXb+sjQI0(3/4) AAS
>>313
GetTypeやtypeofで得られるものはあくまでもType型のマネージドインスタンスだから全く違う
だけど逆アセをするとtypeof()時には即値でハンドルへのポインタ?がアセンブラコードとして埋め込まれてるので内部的にはめちゃくちゃ簡単に得る方法があるはずなんだよね
315: (ワッチョイ 9a8b-IJXt) 01/31(金)14:52 ID:jXb+sjQI0(4/4) AAS
一応自己解決だけどGetTypeやtypeofで得られたTypeインスタンスから「type.TypeHandle.Value」で希望のものは得られた
本来即値で得られるはずなのに冗長でもやもやはするが
316: (ワッチョイ 1a9d-natb) 01/31(金)15:09 ID:gpRv5mHv0(1) AAS
ChatGPTに聞いたら同じ答えが返ってきたけどRuntimeTypeHandle.Valueは環境によってメソッドテーブルへのポインタじゃなくEETypeへのポインタや実装依存のメタデータへのポインタになる場合もあるから自分で確認しろよとのこと
317: (ワッチョイ 4e10-EVp+) 02/01(土)06:49 ID:LNgv56j/0(1/3) AAS
そらJITなんだから・・・
318: (ワッチョイ 1a9d-natb) 02/01(土)10:13 ID:m26c//aC0(1/2) AAS
いやJITは関係ないぞ
319: (ワッチョイ 9a8b-IJXt) 02/01(土)11:06 ID:dQW8A9nv0(1/3) AAS
JITだろうが何だろうがconst intなんかは即値で埋め込まれるしね
だからクラス名.TypeHandleValueみたいなconst持っててくれたら嬉しいんだけど需要ほぼゼロすぎるか
320: (ワッチョイ 1a9d-natb) 02/01(土)12:12 ID:m26c//aC0(2/2) AAS
ん?即値で得られない理由の話だったか
そっちならJIT関係あるわな
321(1): (ワッチョイ 9a8b-IJXt) 02/01(土)12:17 ID:dQW8A9nv0(2/3) AAS
いや関係ないよ
なぜなら逆アセすれば分かるけど思いっきりレジスタ長以下のconst同様の挙動を見せてるからね
typeof時にね
322: (ワッチョイ 17d7-EVp+) 02/01(土)12:48 ID:MtSj47O+0(1) AAS
逆アセw
323(1): (ワッチョイ 4e10-EVp+) 02/01(土)12:53 ID:LNgv56j/0(2/3) AAS
アドレスとかプロセス起動のたびに変わることは無いんだっけ?
324: (ワッチョイ 9a8b-IJXt) 02/01(土)12:59 ID:dQW8A9nv0(3/3) AAS
>>323
.NETの場合は当然変わるしネイティブでも設定次第では変わり得る
でもそもそもC#やJavaは実行時にその都度機械語を組み立てて行く訳だから、であればその都度埋め込めばいいだけの話
325: (ワッチョイ 4e10-EVp+) 02/01(土)13:11 ID:LNgv56j/0(3/3) AAS
なら結局、ユーザークラスじゃ都度変わりうるってことじゃ?
326: (ワッチョイ a36b-natb) 02/01(土)15:14 ID:XDtywhx90(1) AAS
>>321
それはJITやAOT後のものを見てるからでしょ
JIT/AOT時に異なる相対アドレスに配置できる余地を残すためにC#/ILの段階では固定しない
327: (ワッチョイ 3f79-sZTl) 02/02(日)01:00 ID:U03i5Xdj0(1) AAS
ILの段階で定数になるなら決め撃ちで問題ないだろ
328: (ワッチョイ 7f10-cJwu) 02/02(日)06:57 ID:VLFyjNJe0(1) AAS
ユーザークラスがILの段階で決め打ちになるわけないだろ
329: (ワッチョイ 3f8b-YkUZ) 02/02(日)10:55 ID:NGhOMzti0(1/2) AAS
ユーザークラスだろうが何だろうが別に関係ないし
IL段階で定数になる必要もなくて事実として実行時に機械語になるタイミングで定数化されるんだよ
プログラマがその定数にアクセスする手段がないだけで
330: (ワッチョイ 0fd7-cJwu) 02/02(日)11:18 ID:RNSPFW0b0(1) AAS
実行時にならんと決まらんものは定数じゃねぇ
331: (ワッチョイ 3f8b-YkUZ) 02/02(日)12:43 ID:NGhOMzti0(2/2) AAS
定数ってか再三言ってるけど即値だな
332: (ベーイモ MM8f-VqRJ) 02/03(月)22:15 ID:EtXs2rHFM(1) AAS
インスタンスの型の厳密なチェック typeof (X) == x.GetType() やジェネリック型のチェック typeof (T) == typeof (X) はJITで最適化されるから、
質問者のケースがもしこれらに該当するなら変なハックは必要ない
333: (ワッチョイ 5f90-YkUp) 04/14(月)17:39 ID:XKwEHxpo0(1) AAS
Task<T>を返す非同期メソッドをUIスレッドで呼び出して結果を取得したいのですがどうすればいいのでしょうか?
ConfigureAwait(false)の後やTask.Runでスレッドプール上?で実行されてる
コード内からメソッドをUIスレッドで呼んで結果を取得したいのです
334: (ワッチョイ bfbc-6F/1) 04/16(水)05:53 ID:HaWtxdw70(1/3) AA×

335: (ワッチョイ bfbc-6F/1) 04/16(水)05:58 ID:HaWtxdw70(2/3) AAS
あ、TaskCreationOptionsのTaskが抜けてる…
async Task SetTextAsync()の代わりにasync Task<string> GetTextAsync()だったら
StartNew<Task<string>>にしてvar text = await task.Resultすればいい
336: (ワッチョイ 5f90-YkUp) 04/16(水)07:31 ID:QZV5gxIh0(1/2) AAS
ああ、ありがとうごいます
それっぽいです
要はスレッドプールなどで実行されてるメソッドから
途中でダイアログなどを出してユーザのアクションの結果で更に処理を
進めるかキャンセルするかを決定したかったにです
同期コンテキストは調べたのですがこのPostなんたらじゃできないなと..
TaskSchedulerの方から攻めるのですね
ありがとうございます
337: (ワッチョイ 5f90-YkUp) 04/16(水)07:41 ID:QZV5gxIh0(2/2) AAS
ボタンなど押して非同期メソッドを呼び出す
この時、非同期メソッドには介入が必要な時に呼び出される非同期コールバックを渡せるようにする
呼び出し側で、非同期コールバックとして
ダイアログなどをだしたりする
ダイアログの表示などはUIスレッド実行したかった
こんな感じでした
上下前次1-新書関写板覧索設栞歴
あと 181 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.028s