2022年5月7日土曜日

C# 自作アプリのバージョン 追補

VS 自作アプリのバージョン の追補です。
対象は自作のアプリですが、同じ方法で、
普通のアプリにも応用出来るので、
もう少し、細かく、書いて置きましょうか。


VS 自作アプリのバージョン 、
未だ 雛形 叩き台 レベルなので、
今後、根本から変わるかも知れませんし、
使え無いと思えば、プロジェクトの山に埋もれるかも知れません。

でも、もう少し、丁寧に、書き留める事にします。
理由は、応用が利くかも知れない から。
Windows の場合、実行形式ファイル .exe へのショートカットは、
同じ仕組みで対処が可能なので。
尤も、1台のみの環境の場合、こんなもの は不要でしょうけれど、
複数台に導入している場合には、参考になるかも。



そう、使った言語は C# です。
WPF でも良かったのですが、
馴染み深い Form で書いています。

さて、今回、データベースエンジンは使わず、
.xml でお茶を濁しました。
叩き台の .xml を作り、仮データ を数行だけ手書きします。
ひとつのものに 複数台の PC のデータが入る様にします。
試行錯誤 の為の 叩き台 ですね。

  最後の2項目は プログラムを書いている時に追加した項目ですが、
  此処では、最初からあった事にしますね。
  後述の様に、実際のデータは 実行環境 (PC) から取得させます。
  其の為の 叩き台 雛形 です。

<?xml version="1.0" encoding="utf-8"?>
  <ShortCutsTable>

  <ShortCut>
    <RegID>000001</RegID>
    <LnkName>App_2._2013R</LnkName>
    <ExeName>App_2.exe</ExeName>
    <ExeVer>2.1.0.3</ExeVer>
    <PCName>PC1</PCName>
    <Group>¥Desktop¥MyApps¥Photo_Util</Group>
    <LinkFull>C:¥Users¥UserA¥Documents¥Visual Studio 2013¥Projects¥Sol¥Prj¥bin¥Release¥App_2.exe</LinkFull>
    <LnkCreation></LnkCreation>
    <CheckDate></CheckDate>
  </ShortCut>

  <ShortCut>
    <RegID>000002</RegID>
    <LnkName>App20._2017R</LnkName>
    <ExeName>App20.exe</ExeName>
    <ExeVer>2.0.0.25</ExeVer>
    <PCName>PC2</PCName>
    <Group>¥Documents¥MyApps¥System_Util</Group>
    <LinkFull>C:¥Users¥UserA¥Documents¥Visual Studio 2017¥Projects¥Sol¥Prj¥Release¥App20.exe</LinkFull>
    <LnkCreation></LnkCreation>
    <CheckDate></CheckDate>
  </ShortCut>

  </ShortCutsTable>

各ショートカットの情報は、其れで、データ保持しています。
保存場所は、Project の中に Folder を設け、コンテンツ且つ保存です。
従って、Debug や Release の中に Folder が作られ、データ保持されます。

各 PC 名 に対しては、Project に、
User Scope の Setting (設定)を使い、
型 System.Collections.Specialized.StringCollection で持たせ、
同じ型で = Properties.Settings.Default.<arg> で読み込みます。
PC 名は 大文字小文字を区別する System.Net.Dns.GetHostName() です。
Program 内では 此れで比較しますが、
初期値は OS の スタート > 設定 > システム > 詳細情報 > デバイス名 から、
コピペ しましょう。


同様に、各 PC の ショートカットを収めた 基底の Folder も、
StringCollection で持たせます。
長い利用経緯から、PC 毎に 事情 が異なっているのを吸収させます。
双方共、同じ Index が 各 PC と紐付いています。

  因みに、ショートカット名称は、
  既定では xxx.exe - ショートカット(ファイル名:xxx.exe - ショートカット.lnk )ですが、
  視認性から、
  後半を切り詰め、
  xxx._2017R の様に VS Version と Release/Debug 区別を付加しています。
  此れは、大昔から、そうして来ました。


では、
最初に、Form を用意し、DataGridView を貼り付け、
.xml から読み込む部分の Subroutine を書きます。
続けて、DataGridView から .xml へ書き込むものも。
書き込みは PC で Filter して吐ける様にしました。
其の場合、ファイル名初期値には PC の Index を付加し、上書きを避けます。
詳細は省く事にします。


ポイントは ショートカットファイルからリンク先を取得する事でしょうか?。
私も、此れを始めるに当たって最初に検索しました。

class ShortcutFile を作り、
public string TargetPath { get; set; }
等を設けます。

BindingSource や DataTable をフィールドにして置いて、
以下のコードです。  おっと、_ が先頭に付いていませんが ... 。
COM の Windows Script Host Object Modelを参照設定に追加するのを お忘れ無く!。
そう、コード冒頭に、以下も忘れずに!。
using IWshRuntimeLibrary;


        private void GetShortcut(string[] files)
        {
            foreach (string fn in files)
            {
                WshShell shell = new IWshRuntimeLibrary.WshShell();
                IWshShortcut lnk = (IWshShortcut)shell.CreateShortcut(fn);
                var result = new
                {
                    lnk.Description,
                    lnk.FullName,
                    lnk.TargetPath,
                    lnk.WorkingDirectory
                };

                System.Diagnostics.FileVersionInfo vi = System.Diagnostics.FileVersionInfo.GetVersionInfo(lnk.TargetPath);

                DataRow dr = dt.NewRow();
                dr[0] = "";    // ID
                dr[1] = System.IO.Path.GetFileNameWithoutExtension(fn);
                dr[2] = System.IO.Path.GetFileName(lnk.TargetPath);
                dr[3] = vi.FileVersion;   // Ver
                dr[4] = "";    // VerNow
                // 以下省略
                dt.Rows.Add(dr);
            }
        }

さて、此れが動けば、仮データ とは おさらば!。
実際に、各 PC 上で、USB メモリ に保存した実行ファイルから動かし、
データ取得します。
PC 毎の データ を メモ帳 notepad.exe 等で ひと纏め にすれば、
ほんちゃんデータ の 出来上がり。


おっと、
表示用に、リンク作成日付 でソートして、
ID を振っています。
(そう、元データは ID を持ってはいません。)
また、
.exe 初期化の段階で、
実行環境 (PC) の最新バージョン VerNow (E.V.Now) も拾い直しています。


DataGridView ですから、
各項目毎のソートは お手のもの!。



さて、此れからどうするか? は、使い乍ら、ぼちぼち考える事にします。



0 件のコメント:

コメントを投稿