2026年3月31日火曜日

visual studio C# Rev.0.1

C# code読みやってます.

MainWindow.xaml.csが4500行あるうちの半分ぐらい読んだ.
AIに質問すると理解が捗る.

Cの構造体だとこれだけなんだけど、
struct CPUBOXdata{
    public PcData[4]  pcd;
    public byte[1024]   command;
}
それがC#だとこうなるようだ.Marshallとかめんどくさくない?
public struct CPUBOXdata{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] 
    public PcData[]  pcd;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1024)] 
    public byte[]   command;
}


便利な仕組みがあった.
threadをrun()させて無限loopなんだけど、こんな風にキャンセルトークンを渡しておくと、
 cts = new CancellationTokenSource();
 Task.Run(() => ReceiveDataLoop(cts.Token));
あとでloopを停めたいときに、
 cts.Cancel();
とすると合法的にkillできるんだって.これはナイスな仕組みでよかよか.


visual studioの右側に「github copilot」と書かれたタグがあるので、gitのアカでリポジトリを作ったらVS画面からcopilotに質問できるようになった.フリーで使えてるんだけど、フリーなのは今日で最終日なのだろうか?

かしこ

17 件のコメント:

  1. >Marshallとかめんどくさくない?
    まぁ「おまじない」と思って、入れといてください(笑)
    ※c# は、基本的に、
    ・「.NET」と言う「仮想マシン」の上で動いています。Java と同じようなモノ、と思っていいです。
    なので、「仮想マシン上のメモリ」と「リアルのメモリ」で、同期を取る必要が生じる時があります。
    (Windows API を、呼ぶ/呼ばれる(Callback とか)時など)
    で、その時に「行方不明にならないように」ピン止めしておく必要があります。
    「Marshall」キーワードを付けておくことで、「ソレが裏で勝手に実行される」と思ってください。
    ※なので「c#(.NET)内だけで使う」変数などには、付いて無いハズです。
    (付けても良いけど、意味が無い。)

    返信削除
    返信
    1. .NETってライブラリかと思ってたけど仮想マシンだったとは

      Let's marshall !!

      削除
  2. >キャンセルトークン
    スゴイですね。もうこんなところまで来たんですか。。。
    こんなの「かなり作り込まないと」出て来ないですよ。
    (少なくとも「スレッド処理」やらないと出て来ない。)
    ※c#(と言うか「.NET」の仕組みですが)は、この辺がかなり、
    ・ソフィスティケートされてる
    感じですね。そう言う意味では良く出来てます。

    返信削除
    返信
    1. まぁでも「似たようなAPIも多い」ので、
      ・どれ使っていいか分からない
      場面も多いですが。
      ※その辺は「AIに聞く」と、おススメを教えてくれるんだろうな。

      削除
    2. 時間の正確さはどれだけかしらないけど、
      DispachTimerというのがMainWindowで何個か動いていて、
      見た目が軽くRTOSっぽくなっているのは便利な感じがしました

      削除
  3. murasaki
    うーん、自分のにわか知識ではちんぷんかんぷん。解説を聞くとへー、って思うけど、絶対自分では書けない自信あり。

    返信削除
    返信
    1. 我が社に本格的なsoft屋さんが居たという謎

      削除
    2. c#でAI使わずにスレッドのプログラムをかける人は変態に違いない。
      c#の言語仕様を考えている人は過剰にc言語の欠点(記述の一意性とか)を反省をしているようで、特に変数定義のあたりは反省していることを必死にアピールしたくて決めている気配があります。c言語の親戚のふりしてJava寄りなんですかね。ちゃちゃっとツールを作りたくていちいち言語仕様を勉強する気が無いこちらとしては、毎回そんなんしらんがなっ!と頭に来ていました。
      AIができた今となっては懐かしい思い出。

      削除
    3. Javaよりもめんどくさい感じがしちゃった

      codeを書いてるときにメモリ上に展開してる気でいられるCはお気楽でイイわ

      削除
    4. JaveやPythonはある程度削ぎ落した感じがありますが、c#は足して足して肥大化してみたいな感じですね。余程いろいろなことを知っていないと好きなことができないという。Unityのゲームにつまらないのが多いのはc#のせいじゃないかとひそかに思っていたり。

      削除
    5. クリエイターをスポイルしてしまってはいかんいかん

      削除
  4. >Javaよりもめんどくさい感じがしちゃった
    確かに、
    ・Javaを「めんどくさくした」のが、c#
    は、あるかもしれません・・・
    ※作った人は「Java の悪いところを直しました!」と思ってるんだろうけど。Java知ってれば「xxは、Java で言う ○○ のこと」とか、いっぱいあります。(変に知ってると、逆に「混乱」したりもしますが・・・)

    >codeを書いてるときにメモリ上に展開してる気でいられるCはお気楽でイイわ
    「C言語」は、そう言う意味では、
    ・一番分かりやすい
    カモ知れません。コレが「C++」になると、急に「ワケわからなく」なるんだよなー。
    ※C++ も、ある意味「仮想マシン的な仕組み」を前提とした言語仕様が一部にありますし。「動的クラス」なんか、その類。
    そう言う意味では、c# は、
    ・(C++)++ (で、c# になる)
    なトコロはあります。c++ の進化系、と言うか。

    返信削除
    返信
    1. >Javaを「めんどくさくした」のが、c#

      まったくも~やめて~(笑)

      これまで、
      C++でmethodでうんたらかんたらぐらいはやってました
      Androidのコトリンでガジェットを画面に配置してイベントハンドラでバインドするぐらいはやってました
      javaでthread建てたり少しやってみました

      なのでC#が何をやってるのかぐらいはなんとか理解できそうです

      でもMarshallとか細かいとこは目がチカチカしてしまいます

      削除
    2. Java も、イロイロやっていくと、「Windows API」を呼びたくなったりして、
      ・JNI / JNA とかのお世話になる
      ことがあると思いますが(笑)まぁ、「マーシャリング」(と言う、マイクロソフト用語がある)は、それの、「.NET」版、と思っていただければいいです。
      ※JNI / JNA も、イロイロと面倒です(笑)私は自分でやったこと無いからよく知らんけど。ソレを使った(Java)アプリケーションは、使ったことがありますが。
      ※MS的には「Marshal As」って書けば、そのまま使えるから良いでしょ?とか、思ってるんだと思います。まぁ、一々「変な DLL とリンクさせる」よりは手軽カモだが、どっちが良いのかは分からない。

      削除
    3. MarshallよりもMahjongだったら洒落ててよかったと思います

      削除
  5. >「C++」になると、急に「ワケわからなく」なる
    C++ って、Object を New 出来たりする時点で、何らかの、
    ・スーパバイザプロセス
    が居ないと成り立たないと思うんだよな。なので、絶対に「ランタイム内」に、「管理プロセス」が居るハズなんだけど。もう、一種の「簡易言語」と同じレベル。
    ※あんまりこういう「C++ の、内部的な動き」って、語られてるのを聞いたこと無いな。

    返信削除
    返信
    1. Run Time routineなんかよりも偉いヒトがなかに棲んでいる・・・

      削除