DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
Nomal.NetでのIPv6の比較(5) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | Nomal.Net 5.0 におけるDLL参照問題?(7) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | Nomal親スレッドへ処理の移譲(7) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal新たにshowしたフォームでのボタンのクリック(5) | Nomalリッチテキストボックスの文字を太文字にしたい(2) | NomalVB.netにおける固定長出力方法(3) | NomalDataObjectの使いまわし(5) | NomalLIstview のDataSource(2) | NomalClassの作り方(2) | NomalOpenFileDialogの初期ファイル名の表示が変(1) | NomalVB.NETのVBA化(2) | Nomal改行のコード(7) | NomalGoogle翻訳の結果の取得(2) | NomalStopwatchクラスのElapsedMillisecondsの挙動(2) | Nomal.net Chartで二重ドーナツグラフの作り方(3) | Nomalexeをショートカットから起動した場合のエラー(2) | Nomalデスクトップ と Desktop(6) | Nomalデザイナのプロパティウィンドウで静的プロパティを選択したい(3) | NomalPHPでシリアライズした、データをデシリアライズしたい(4) | Nomal二次元配列 インデックスが配列の境界外(2) | NomalVB.netで作成したexeのNgenによる弊害(1) | NomalDrawBezierの使い方について(7) | Nomalメジャーバージョンの異なるLog4netライブラリを参照したい(4) | NomalVB6→2005変換時のDeclare宣言のマーシャリング属性(8) | NomalGROUPBOXの複製について(vb.net)(1) | NomalActiveReports 3.0からActiveReports 7.0へのァイルコンバータについて(4) | NomalAccess OLEでExecuteNonQuery(3) | NomalKeyDownでの右コントロールキーイベント(2) | NomalExcel複数シートの印刷順序(3) | NomalWMPへno(3) | NomalDataGridViewの行番号(7) | Nomalapp.config定義によるネットワークトレースログの世代管理(2) | Nomalrelease/debugのどちらで作成されたものかを判断する方法(2) | NomalC#コンソールアプリでタイピング練習ソフト作成(3) | Nomal自分自身を呼び出すのはOKですか(1) | NomalWebBrowser Control foreachで値が消える(2) | NomalDeclare宣言するdllと参照追加をするdllの区別(4) | NomalTaskクラスを.NET Framework 2.0で実現させる方法(2) | NomalVS2017で作成されたDLLをVS2005で作成されたAPで使用する方法(4) | NomalWebBrowser Controlを使って、任意の値を取得(5) | NomalEditボックスに簡体字をセットする方法(2) | NomalList型でエラーが起きてしまい・・・(1) | Nomalフォルダ内の全ての容量を取得したい(4) | NomalWebClientが上手く動かない(2) | Nomal共変性と反変性ってこういうこと?(4) | Nomalモードレスフォーム Warning IDE0067を回避したい(7) | NomalLINQの拡張メソッドの定義(1) | Nomalこんな演算子初めて見ました。(5) | Nomalプロセスからウインドウを取得(4) | Nomalフォーム外のカーソルの変更(2) | NomalLINQのメソッド構文の書き方(3) | NomalVB.NETでCSVを読み込む際にSQL文を使いたい(3) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(2) | NomalRichTextBoxで入力文字の自動折り返しを止めたい(5) | Nomalラムダ式の勉強中(2) | NomalWebClientで、短期間にDownloadStringAsyncを実行したい(2) | Nomalvb.net+SQLiteで複数データベースファイルへのトランザクション方法(3) | NomalNewの使い方間違ってますか?(4) | Nomalジェネリック型インターフェースを使った変数を扱いたい(3) | NomalC#をVBに変換(2) | NomalProcess.WaitForExitで正常に動作しない?(3) | NomalCatch時のex.StackTraceの情報(3) | Nomalユーザーコントロール内のテキストボックスのmodifiedプロパティ(4) | NomalPictureBox.Locationのキャンセル(3) | NomalJOIN操作の構文エラー(4) | NomalVisualStudioでマクロ(3) | NomalVisualStudioでExcelのVSTO開発(3) | NomalOracleDataAccess を参照したプログラムでデバッグモードが機能しなくなる(3) | NomalIE11では表示されるが、.netのWebBrowserでは、表示されないHPを表示する方法(7) | NomalマウスのないOSでマウスカーソルの表示(2) | NomalRDP接続でのネットワーク帯域制限(0) | NomalFILE.COPYでIOExceptionエラーが出る(11) | NomalToolStripMenuItemにShortcutKeysを指定した際の、元のコントロールを取得する方法(2) | Nomal動的にプロパティや変数の値の取得(4) | NomalVB6 ほかのアプリケーションを起動し そのアプリケーションは終了させる方法(4) | NomalMouseEventArgsのカレント座標(2) | Nomalリッチテキストボックスでの字間の調整(2) | NomalDrawImage でメモリ不足エラー(3) | Nomal必須コンポーネントの一覧に追加したい(0) | NomalCode128でバーコードが読み取れない(8) | NomalあるWindows10PCでビルドしたEXEがW8.1以下で実行エラー(5) | NomalApp.configのMy.Application.Log設定で使用できない属性が出る(0) | NomalVC++ → VB.Netに変換時に文法エラー(2) | Nomalvb2010を使用したmicrosoft Wordの任意の行の削除(0) | NomalVb.netからAccessへの接続について(3) | NomalSQL-Server Compact 4.0が表示されない(2) | Nomalバーコードの数字を非表示にしたい(2) | Nomal令和の日付への対応(3) |



■記事リスト / ▼下のスレッド
■34656 / 親記事)  .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(30回)-(2021/02/26(Fri) 14:39:28)
  • アイコン環境/言語:[Windows10(2004) 64bit、.Net 5.0、VS2019(16.8.5)Com版、C#] 
    分類:[.NET] 

    いつも本掲示板でお勉強させていただいております。

    さてタイトルの件ですが、ご存知の通りIPv6は同じアドレスでも
    以下の様に複数の表記が可能です。
    2001:db8:0:0:1:0:0:1
    2001:0db8:0:0:1:0:0:1
    2001:db8::1:0:0:1
    2001:db8::0:1:0:0:1
    2001:0db8::1:0:0:1
    2001:db8:0:0:1::1
    2001:db8:0000:0:1::1
    2001:DB8:0:0:1::1

    そこで質問なのですが.Netのライブラリで表記(文字列)の異なる
    IPv6アドレスが等しいかチェックできる様なクラスなどあったり
    しませんでしょうか?

    普通にありそうな機能かと思ってネットを検索したのですが、
    私の見た限りでは発見できませんでした。

    理想としては
    XXXClass addPattern1 = new XXXClass("2001:db8:0:0:1:0:0:1");
    XXXClass addPattern2 = new XXXClass("2001:DB8:0:0:1::1");
    if (addPattern1.Equals(addPattern2)) { Debug.WriteLine("等しい"); }
    的な感じです。

    自分でも作れはしますが、もし.Netにあったら勿体ないので
    どなたかご存知の方がいらっしゃいましたら教えて下さい。

    以上です。宜しくお願い致します。

違反を報告
引用返信

▽[全レス5件(ResNo.1-5 表示)]
■34657 / ResNo.1)  Re[1]: .NetでのIPv6の比較
□投稿者/ Hongliang 大御所(597回)-(2021/02/26(Fri) 14:51:53)
  • アイコンSystem.Net名前空間のIPAddressクラスを使えばいいのではないでしょうか。
    文字列からはIPAddress.Parse静的メソッド(またはTryParse静的メソッド)でインスタンス化できます。
違反を報告
引用返信
■34658 / ResNo.2)  Re[2]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(32回)-(2021/02/26(Fri) 15:30:29)
  • アイコンHongliangさん、ご返信ありがとうございます。

    IPAddressクラスでのIPv6アドレス比較、できちゃいました…。

    以前このクラスで以下の様にIPv4アドレスで
    文字列比較とインスタンス比較した時に

    IPAddress add1 = IPAddress.Parse("172.17.22.100");
    IPAddress add2 = IPAddress.Parse("172.017.022.100");
    if (add1.Equals(add2)) { Debug.WriteLine($"等しい"); }
    if (add1.ToString().Equals(add2.ToString())) { Debug.WriteLine($"等しい"); }

    「等しくない」判定されたのでIPv6でも同じかと思っていました。
    まさかIPv6だと「等しい」判定になるとは…。

    何故IPv4だと等しくないのかは分かりませんが、
    ひとまずタイトルの件は解決したので解決済みと
    させていただきます。

    迅速な回答、ありがとうございました。

解決み!
違反を報告
引用返信
■34659 / ResNo.3)  Re[3]: .NetでのIPv6の比較
□投稿者/ Hongliang 大御所(598回)-(2021/02/26(Fri) 15:40:50)
  • アイコン2021/02/26(Fri) 15:52:43 編集(投稿者)

    IPv4において、0プリフィクスがついている桁は8進数を意味します。
    Trace.WriteLine(IPAddress.Parse("172.017.022.100"));
    => 172.15.18.100

    // ただし0プリフィクスがあっても普通に10進数で扱う流儀もあるのでいかんともしがたいですが。

    ちなみに0xプリフィクスで16進数表記もできます。

解決み!
違反を報告
引用返信
■34660 / ResNo.4)  Re[4]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(33回)-(2021/02/26(Fri) 17:18:20)
  • アイコンHongliangさん、再度返信ありがとうございます。

    > IPv4において、0プリフィクスがついている桁は8進数を意味します。
    > Trace.WriteLine(IPAddress.Parse("172.017.022.100"));
    > => 172.15.18.100

    おぉ!
    int i = 0x01;
    の様な数値リテラルだけでなく、上記の様な文字列
    (しかも.で区切られた途中のオクテットに対して)でも
    プレフィックスが有効になるのですね。
    等しくない扱いになるのは当然だったと(^_^;)

    細かい部分のフォローまでありがとうございました。

解決み!
違反を報告
引用返信
■34661 / ResNo.5)  Re[5]: .NetでのIPv6の比較
□投稿者/ あばば無人君 一般人(34回)-(2021/02/26(Fri) 18:17:53)
  • アイコン本件、微妙なオチまでつきました。

    Hongliangさんに教えて頂いたIPAddressクラスによる比較と、
    その他ネットを見ていたらNetworkInterfaceクラスから
    アダプタに設定されているIPアドレスをIPAddressクラスで
    取得できることを知り、以下の様なパソコンのNICに引数の
    IPアドレスが存在するかチェックする関数を作成しました。


    public bool ExistIpAddress(string ipAddress)
    {
      // 戻り値(初期値:存在しない)
      bool result = false;

      try
      {
        // 引数IPアドレス文字列からIPAddressクラスを生成
        IPAddress ipObj = IPAddress.Parse(ipAddress);

        // IPアドレスリストを生成
        List<IPAddress> addList = new List<IPAddress>();

        StringBuilder logStr = new StringBuilder();
        logStr.AppendLine($"有効なネットワークインターフェースカードとそのIPアドレス");

        // 全てのネットワークインターフェース(アダプタ)の数だけ繰り返す
        foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
        {
          // 有効(=稼働中)なアダプタでなければ次へ
          if (adapter.OperationalStatus != OperationalStatus.Up) { continue; }

          logStr.AppendLine($"{adapter.Name}({adapter.OperationalStatus})");

          // アダプタに設定された全IPアドレス情報を取得
          // ※1つのアダプタに複数のIPアドレスを設定できる点に注意!
          IPInterfaceProperties ifProperties = adapter.GetIPProperties();

          // 全IPアドレス情報をリストに追加
          foreach (UnicastIPAddressInformation info in ifProperties.UnicastAddresses)
          {
            // IPアドレス情報がIPv4かIPv6の場合
            if (info.Address.AddressFamily == AddressFamily.InterNetwork
            || info.Address.AddressFamily == AddressFamily.InterNetworkV6)
            {
              // そのままIPアドレスリストに追加
              addList.Add(info.Address);
              logStr.AppendLine($"  {info.Address}");
            }
          }
        }

        // 引数IPアドレスが存在するかチェック
        result = addList.Any(a => a.Equals(ipObj));

        // 存在しなかった場合だけログを出す
        if (!result)
        {
          logStr.AppendLine($"IPアドレス[{ipAddress}]は存在しません");
          Debug.WriteLine(logStr.ToString());
        }
      }
      catch (Exception ex)
      {
        Debug.WriteLine(ex.ToString());
      }

      return result;
    }


    試しにこの関数の引数にローカルPCのIPv6アドレス文字列を
    渡して動作確認してみたところ、「存在しない」となりました。

    原因を調べたところ、NetworkInterfaceクラスから取得できる
    IPAddressクラスにはIPアドレスの末尾に「スコープID」という
    NICを識別するコードが付いており、その情報まで込みで
    比較を行うために「存在しない」判定となっておりました。

    よってIPv6アドレスの場合は以下の様に再度IPAddressクラスを
    生成し直して比較することになりました。※修正箇所のみ記載


            // IPアドレス情報がIPv4の場合
            if (info.Address.AddressFamily == AddressFamily.InterNetwork)
            {
              // そのままIPアドレスリストに追加
              addList.Add(info.Address);
              logStr.AppendLine($"  {info.Address}");
            }
            // IPアドレス情報がIPv6の場合
            else if (info.Address.AddressFamily == AddressFamily.InterNetworkV6)
            {
              // NetworkInterfaceクラスから取得できるIPv6アドレスの場合は末尾にスコープIDが付加されており
              // スコープIDが付加された状態のIPAddressクラスだと↓のEquals関数による存在チェックで
              // 等しいと判定されないので、スコープIDを除去したIPアドレスで再度IPAddressクラスを生成した!
              // ※スコープIDは「%」より後ろに記述されている
              string[] addScope = info.Address.ToString().Split("%".ToCharArray());
              addList.Add(IPAddress.Parse(addScope[0]));
              logStr.AppendLine($"  {addScope[0]}");
            }

    結局泥臭いコードが入ってしまいました。
    ちゃんちゃん。

    では、長くなりましたがこの辺で。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-5]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34646 / 親記事)  追加コントロールのtabindex値を既存の間に設定する方法
□投稿者/ こうろぎ 一般人(1回)-(2021/02/19(Fri) 16:56:16)
  • アイコン環境/言語:[Visual Studio 2017 (VB)] 
    分類:[.NET] 

    フォーム上に100以上にコントロールが
    ぎゅうぎゅうに配置され、
    タブオーダーも正しく設定されています。
    
    今回、フォーム上にコントロールを追加して
    タブオーダーも既存の番号の間に挿入したいのですが、
    良い方法はないでしょうか?
    
    デザイナ画面の「タブオーダー」を表示させて
    コントロールを最初から全部
    クリックし直すしかないでしょうか?
    面倒ですし、クリック間違いで、
    変な順番になってしまう危険もあります。
    
    よい方法をご教示いただけませんでしょうか。

違反を報告
引用返信

▽[全レス1件(ResNo.1-1 表示)]
■34655 / ResNo.1)  Re[1]: 追加コントロールのtabindex値を既存の間に設定する方法
□投稿者/ shu 大御所(492回)-(2021/02/22(Mon) 17:45:05)
  • アイコンNo34646に返信(こうろぎさんの記事)

    こちらでは拡張機能を自前で用意して対応しています。
    仕事で利用しているものですので公開は出来ませんが
    DTE2を利用してリスト内の順番でタブインデックスを振り直すことを行っています。

    後は手動で設定するとしたらDesignerファイルを直接直しすという方法もあります。


違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-1]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34647 / 親記事)  .Net 5.0 におけるDLL参照問題?
□投稿者/ あばば無人君 一般人(24回)-(2021/02/20(Sat) 12:41:50)
  • アイコン環境/言語:[Windows10(2004) 64bit、.Net 5.0、VS2019(16.8.5)Com版、C#] 
    分類:[.NET] 

    いつも本掲示板でお勉強させていただいております。

    さてタイトルの件ですが、現在以下2つのプロジェクトがあります。
    ・プロジェクトA:DLL
    ・プロジェクトB:プロジェクトAを参照するWinFormアプリ(EXE)

    プロジェクトBは上記の通り依存関係(昔のVSで言う"参照")の
    設定にて、プロジェクトAの出力ディレクトリにあるDLLを
    参照しています。

    この状態でビルド後プロジェクトBの出力ディレクトリを見ると
    BのEXEだけでなくAのDLL+PDBも存在していました。

    Aの出力ディレクトリにあるDLL+PDBとバイナリ比較しましたが
    差異は有りませんでした。また、EXEは普通に実行できました。

    問題はここからなのですが、ビルド後Bの出力ディレクトリに
    AのDLL+PDBをコピーさせない様にするため、Bの依存関係にある
    Aのプロパティを表示し、「ローカルにコピー」をいいえに
    設定しました。

    この状態でビルドすると想定通りBの出力ディレクトリに
    AのDLL+PDBは配置されなくなりました。
    もちろんEXEの実行にも失敗します。
    (イベントビューアーのアプリケーションログにエラーが出る)

    ところがAの出力ディレクトリにあるDLL+PDBをコピーして
    Bの出力ディレクトリに持ってきても、EXEの実行に失敗します。

    AのDLL+PDBを持ってくれば「ローカルにコピー」をいいえに
    する前と同じ状態になっている筈なのに何故実行に失敗するのか
    理由が分かりません。
    (昔の.Net Frameworkで同じことをしたら実行できた様な気が…)

    理由が分かる方がいらっしゃいましたら教えて頂きたいです。
    また、コピーしてきてからEXEを動かせる様にする方法も
    ご存知でしたら併せて教えて頂きたいです。

    以上です。宜しくお願い致します。

違反を報告
引用返信

▽[全レス7件(ResNo.3-7 表示)]
■34650 / ResNo.3)  Re[2]: .Net 5.0 におけるDLL参照問題?
□投稿者/ あばば無人君 一般人(26回)-(2021/02/20(Sat) 18:39:20)
  • アイコンAzuleanさん、ご返信ありがとうございます。

    > ローカルコピーを「いいえ」にすると、deps.json に依存関係が記述されなくなります。
    > deps.json に書かれていないアセンブリはアプリと同じフォルダーであっても読み込まれなくなります。

    上記ですが、個人的にはう〜んって感じです。
    VisualStudio上ではローカルコピーを「いいえ」にしていても
    プロジェクトAのDLLにある関数などは使える(ビルドも通る)のに、
    いざ実際にEXEを起動しようとするとdeps.jsonに記述が無いから
    DLLがあっても読み込まない→そして起動に失敗するって、これでは
    ローカルコピーの設定が何のためにあるのかわかりません。

    こんな開発者を混乱させる動きにするぐらいならそもそも
    ローカルコピーの設定自体無い方がよい気がしました。
    何か意味/メリットってありますかね…?


    > とりあえず、ローカルコピー「いいえ」でなんとかするやり方はやめた方が良いと思います。

    現状そうするしかありませんね…。
    ローカルコピーはありにして、他のDLLやEXEを全て手動で纏める
    開発方針にします。


    他の記述含めご返信、ありがとうございました。
    (愚痴っぽくなってしまい申し訳ありませんでした)

違反を報告
引用返信
■34651 / ResNo.4)  Re[3]: .Net 5.0 におけるDLL参照問題?
□投稿者/ Azulean 大御所(526回)-(2021/02/20(Sat) 18:51:12)
  • アイコンNo34650に返信(あばば無人君さんの記事)
    > VisualStudio上ではローカルコピーを「いいえ」にしていても
    > プロジェクトAのDLLにある関数などは使える(ビルドも通る)のに、
    > いざ実際にEXEを起動しようとするとdeps.jsonに記述が無いから
    > DLLがあっても読み込まない→そして起動に失敗するって、これでは
    > ローカルコピーの設定が何のためにあるのかわかりません。

    お望みのことを満たすための機能ではないということでしょう。

    ・ビルド時に参照する DLL と、実行時に使う DLL が異なるとき
     →その DLL は別途インストールするなど、アプリケーションの固有 DLL ではない。

    ・ソリューションが何十ものプロジェクトで構成されていて、個別にコピーしているとディスクコピーが多くてビルドが長くなる
     →アプリケーションプロジェクトだけコピーするようにしたい


    「同一ソリューションでプロジェクト参照して何もいじらない」がスタンダードな使い方です。
    ローカルコピーをいじる必要なんて .NET Framework 時代でもほぼなかったはずですので。
違反を報告
引用返信
■34652 / ResNo.5)  Re[4]: .Net 5.0 におけるDLL参照問題?
□投稿者/ あばば無人君 一般人(27回)-(2021/02/21(Sun) 13:02:55)
  • アイコンAzuleanさん、ご返信ありがとうございます。

    > ・ビルド時に参照する DLL と、実行時に使う DLL が異なるとき
    >  →その DLL は別途インストールするなど、アプリケーションの固有 DLL ではない。

    上記ですが、私の知識不足かご記載の内容が理解できません。

    ビルド時に参照するDLLと、実行時に使うDLLが異なっていても
    いなくても、deps.jsonに記述が無ければEXEの起動に失敗する
    結果は一緒ではないでしょうか?

    別途インストールするDLLだと、deps.jsonに記述が無くても
    EXEの起動が成功するケースがあったりするのでしょうか?


    > ・ソリューションが何十ものプロジェクトで構成されていて、個別にコピーしているとディスクコピーが多くてビルドが長くなる
    >  →アプリケーションプロジェクトだけコピーするようにしたい

    なるほど!ビルド時間は盲点でした。
    コピーの工程が無くなればビルド時間が短くなるという
    メリットはありますね。

    ただ、deps.jsonに記述が無いのでEXEの起動に失敗するという
    結果は変わらない様な気がしますが。


    > 「同一ソリューションでプロジェクト参照して何もいじらない」がスタンダードな使い方です。

    確かにスタンダードの1つです。
    ですが、フレームワークとなるDLLの開発と、そのDLLを使った
    業務案件の開発などとで、ソリューションが異なることもよくある
    ケースかと思います。


    > ローカルコピーをいじる必要なんて .NET Framework 時代でもほぼなかったはずですので。

    それを言ってしまうと、前回の私の投稿にある
    > ローカルコピーの設定自体無い方がよい気がしました。
    と、同じ感じになりませんか?


    …なんかいまいち会話が噛み合っていない様な気がします。

違反を報告
引用返信
■34653 / ResNo.6)  Re[5]: .Net 5.0 におけるDLL参照問題?
□投稿者/ Azulean 大御所(527回)-(2021/02/21(Sun) 16:42:43)
  • アイコン2021/02/21(Sun) 16:48:49 編集(投稿者)

    No34652に返信(あばば無人君さんの記事)
    > …なんかいまいち会話が噛み合っていない様な気がします。

    私は「こう思う」と主張しているだけで、合意を得たいわけでもないですし、開発チームの思いを代弁できるわけでもありませんので、その点は理解いただければ。

    とりあえず、「.NET 5 世代でローカルコピーを触ることはほぼない」言えると思います。
    (有用なケースは、ビルド時間短縮の工夫で存在するとは思います)


    > ビルド時に参照するDLLと、実行時に使うDLLが異なっていても
    > いなくても、deps.jsonに記述が無ければEXEの起動に失敗する
    > 結果は一緒ではないでしょうか?

    アプリケーションと一緒にインストールするとは限らないのでは?と考えてこのように書きましたが、GAC の概念が廃止されていることを考えると、このシナリオは存在しないかもしれません。
    調査不足ですみません。。。

    (ADDITIONAL_DEPS で無理矢理追加することはできそうですが、一般的とは言えないかもしれません)
    https://docs.microsoft.com/ja-jp/dotnet/core/dependency-loading/default-probing#host-configured-probing-properties


    > ただ、deps.jsonに記述が無いのでEXEの起動に失敗するという
    > 結果は変わらない様な気がしますが。

    「アプリケーションプロジェクトだけコピーするようにしたい」で示したつもりでしたが、書き方を改めると「アプリケーションプロジェクトで参照し、ローカルコピーする」ということです。
    ビルドイベントや手作業のコピーの話ではありません。

    > ですが、フレームワークとなるDLLの開発と、そのDLLを使った
    > 業務案件の開発などとで、ソリューションが異なることもよくある
    > ケースかと思います。

    その DLL だけのコピーで異なるソリューションへ配布・連携してしまうと、外部依存関係が引き継がれないので、DLL 単位での配布・連携はそろそろやめた方が良いかもしれません。
    .NET 5 の開発では NuGet パッケージに依存することが多いため、その外部依存関係をきちんと伝搬しないと、deps.json に記載がなくて実行時エラーになりかねません。

    ソリューションを分けないといけなくなったら、ローカルの NuGet パッケージ作らないといけないかもしれませんね。

    なお、本格的に業務で取り組む状況になっていないので、最適論はわかりません。
    .NET 5 のサポートも来年 1 月で終わる短期ものなので(LTS ではないので)、移行する企業は少ないのではないでしょうか?


    > それを言ってしまうと、前回の私の投稿にある
    >>ローカルコピーの設定自体無い方がよい気がしました。
    > と、同じ感じになりませんか?

    「安易に使うと起動しない exe になるなら、そんな設定見せるべきじゃない」は極端じゃないですか?
    ビルド時間短縮に効果のある技としては使えるので、わかっていて使う人が使うには良いでしょう。
    (このプロパティの存在を知っていて使っている人は .NET 開発者の中で多数派とは言えないはず…)

    あくまで私は「このように思う」を書いているのであって、機能の存在意義を議論したいわけではありません。
    もし、存在意義がないから機能をなくすべきでは…と提案したいのであれば、Developer Community に挙げてください。
違反を報告
引用返信
■34654 / ResNo.7)  Re[6]: .Net 5.0 におけるDLL参照問題?
□投稿者/ あばば無人君 一般人(28回)-(2021/02/22(Mon) 11:57:04)
  • アイコンAzuleanさん、ご返信ありがとうございます。

    > アプリケーションと一緒にインストールするとは限らないのでは?と考えてこのように書きましたが、GAC の概念が廃止されていることを考えると、このシナリオは存在しないかもしれません。

    GACの概念、廃止になったのですね。恥ずかしながら知りませんでした。
    確かにGACがあれば、deps.jsonに記述が無くてもEXEは起動しそうですね。



    > 「アプリケーションプロジェクトだけコピーするようにしたい」で示したつもりでしたが、書き方を改めると「アプリケーションプロジェクトで参照し、ローカルコピーする」ということです。
    > ビルドイベントや手作業のコピーの話ではありません。

    上記、理解いたしました。


    > 「安易に使うと起動しない exe になるなら、そんな設定見せるべきじゃない」は極端じゃないですか?
    > ビルド時間短縮に効果のある技としては使えるので、わかっていて使う人が使うには良いでしょう。

    確かに早計でした。撤回します。

    (ビルド時間短縮で使ったとして、結局そのままだと
    deps.jsonに記述が無いのでEXEの起動に失敗するから
    自分で記述を追加しないといけない手間を考えると
    個人的にはやはりメリットは見えませんが…)



    だいぶ話が逸れてしまいましたが、私の3つ目の投稿の通り、
    > ローカルコピーはありにして、他のDLLやEXEを全て手動で纏める
    > 開発方針にします。
    として本件は解決済みとさせていただきます。

    何度もご回答いただきありがとうございました。

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-7]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■34642 / 親記事)  VB.net非同期処理でtextboxに出力したい
□投稿者/ ゆき 一般人(1回)-(2021/02/12(Fri) 08:45:02)
  • アイコン環境/言語:[win10 VB.net 最新版] 
    分類:[.NET] 

    https://dobon.net/vb/dotnet/process/standardoutput.html

    この中の「コマンドプロンプトに文字列を入力することで、複数のコマンドを実行する」の項目はコンソールに出力していますがこれをテキストボックスに出力ししたいと考えています。
    調べたところデリゲート処理が必要らしいのですがどのように改定いうかわかりません。
    教えて下さい。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34644 / ResNo.1)  Re[1]: VB.net非同期処理でtextboxに出力したい
□投稿者/ 魔界の仮面弁士 大御所(1314回)-(2021/02/12(Fri) 11:00:27)
  • アイコン
    No34642に返信(ゆきさんの記事)
    > 調べたところデリゲート処理が必要らしいのですがどのように改定いうかわかりません。
    
    たとえばこんな感じ。
    
    Public Class Form1
        Private WithEvents proc As Process
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            If Me.components Is Nothing Then
                Me.components = New System.ComponentModel.Container()
            End If
            Button1.Text = "開始"
            Button2.Text = "標準入力を渡す"
            Button2.Enabled = False
            'コマンド
            TextBox1.Text = Environment.GetEnvironmentVariable("ComSpec")
            '引数
            TextBox2.Text = ""
            '標準入力の内容
            TextBox3.Text = "DIR /D ""C:\Program Files (x86)\"""
            '標準出力 & 標準エラー出力
            RichTextBox1.ReadOnly = True
            RichTextBox1.BackColor = Color.Black
            RichTextBox1.ForeColor = Color.White
            RichTextBox1.ScrollBars = RichTextBoxScrollBars.Both
            RichTextBox1.WordWrap = False
            RichTextBox1.HideSelection = False
        End Sub
        Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Button1.Enabled = False
            TextBox1.ReadOnly = True
            TextBox2.ReadOnly = True
            RichTextBox1.Clear()
            Button2.Enabled = True
            proc = Process.Start(New ProcessStartInfo(TextBox1.Text, TextBox2.Text) With
            {
                .UseShellExecute = False,
                .CreateNoWindow = True,
                .RedirectStandardInput = True,
                .RedirectStandardOutput = True,
                .RedirectStandardError = True
            })
            Me.components.Add(proc)
            proc.BeginOutputReadLine()
            proc.BeginErrorReadLine()
            Await Task.Run(AddressOf proc.WaitForExit)
            proc.Close()
            Me.components.Remove(proc)
            TextBox1.ReadOnly = False
            TextBox2.ReadOnly = False
            Button2.Enabled = False
            Button1.Enabled = True
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            If proc IsNot Nothing Then
                proc.StandardInput.Write(TextBox3.Text & vbLf)
            Else
                Debug.WriteLine("既に閉じられている")
            End If
        End Sub
        Private Sub proc_OutputDataReceived(sender As Object, e As DataReceivedEventArgs) Handles proc.OutputDataReceived
            StandardOut(e.Data, isError:=False)
        End Sub
        Private Sub proc_ErrorDataReceived(sender As Object, e As DataReceivedEventArgs) Handles proc.ErrorDataReceived
            StandardOut(e.Data, isError:=True)
        End Sub
        Private Sub StandardOut(message As String, isError As Boolean)
            Invoke(
                New MethodInvoker(
                   Sub()
                       Dim s = RichTextBox1.TextLength
                       Dim l = If(message?.Length, 0)
                       RichTextBox1.SelectionStart = s
                       RichTextBox1.SelectedText = If(message, "")
                       RichTextBox1.Select(s, l)
                       RichTextBox1.SelectionColor = If(isError, Color.Yellow, RichTextBox1.ForeColor)
                       RichTextBox1.SelectionBackColor = If(isError, Color.Red, RichTextBox1.BackColor)
                       RichTextBox1.SelectionStart = RichTextBox1.TextLength
                       RichTextBox1.SelectedText = vbCr
                   End Sub
                )
            )
        End Sub
    End Class
    
    
    ただし、標準出力された内容の末尾が改行で無いと
    OutputDataReceived イベントが発生しない点にご注意ください。
    
    「TIME /T」の結果は改行が来るのですぐに表示されますが、
    「TIME」は改行を伴わないため、次の応答が来るまでイベントが発生しません。
    
    「PAUSE」コマンドなどとも相性が悪いですね。

違反を報告
引用返信
■34645 / ResNo.2)  Re[2]: VB.net非同期処理でtextboxに出力したい
□投稿者/ 魔界の仮面弁士 大御所(1315回)-(2021/02/12(Fri) 11:47:14)
  • アイコン
    No34644に追記(魔界の仮面弁士の記事)
    > ただし、標準出力された内容の末尾が改行で無いと
    > OutputDataReceived イベントが発生しない点にご注意ください。
    
    Process.OutputDataReceived イベントの代わりに
    StandardOutput.ReadAsync メソッドを使うようにしてみました。
    
    これなら「PAUSE」や「TIME」にも対応できるかと思います。
    
    
    Public Class Form1
        Private proc As Process
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            If Me.components Is Nothing Then
                Me.components = New System.ComponentModel.Container()
            End If
            Button1.Text = "開始"
            Button2.Text = "標準入力を渡す"
            Button2.Enabled = False
            'コマンド
            TextBox1.Text = Environment.GetEnvironmentVariable("ComSpec")
            '引数
            TextBox2.Text = ""
            '標準入力の内容
            TextBox3.Text = "DIR /D ""C:\Program Files (x86)\"""
            '標準出力 & 標準エラー出力
            RichTextBox1.ReadOnly = True
            RichTextBox1.BackColor = Color.Black
            RichTextBox1.ForeColor = Color.White
            RichTextBox1.ScrollBars = RichTextBoxScrollBars.Both
            RichTextBox1.WordWrap = False
            RichTextBox1.HideSelection = False
        End Sub
        Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Button1.Enabled = False
            TextBox1.ReadOnly = True
            TextBox2.ReadOnly = True
            RichTextBox1.Clear()
            Button2.Enabled = True
            proc = Process.Start(New ProcessStartInfo(TextBox1.Text, TextBox2.Text) With
            {
                .UseShellExecute = False,
                .CreateNoWindow = True,
                .RedirectStandardInput = True,
                .RedirectStandardOutput = True,
                .RedirectStandardError = True
            })
            Me.components.Add(proc)
            Await Task.WhenAll(
                ConsumeOutput(proc.StandardOutput, False),
                ConsumeOutput(proc.StandardError, True),
                Task.Run(AddressOf proc.WaitForExit)
            )
            proc.Close()
            Me.components.Remove(proc)
            TextBox1.ReadOnly = False
            TextBox2.ReadOnly = False
            Button2.Enabled = False
            Button1.Enabled = True
        End Sub
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            If proc IsNot Nothing Then
                proc.StandardInput.Write(TextBox3.Text & vbLf)
            Else
                Debug.WriteLine("既に閉じられている")
            End If
        End Sub
        Private Async Function ConsumeOutput(reader As System.IO.TextReader, isError As Boolean) As Task
            Dim buffer(2047) As Char
            Dim length As Integer = Await reader.ReadAsync(buffer, 0, buffer.Length)
            Dim foreColor = If(isError, Color.Yellow, Color.White)
            Dim backColor = If(isError, Color.Red, Color.Empty)
            While length > 0
                Dim message As New String(buffer, 0, length)
                Invoke(
                    New MethodInvoker(
                       Sub()
                           Dim pos = RichTextBox1.TextLength
                           RichTextBox1.Select(pos, 0)
                           RichTextBox1.SelectedText = If(message, "")
                           RichTextBox1.Select(pos, length)
                           RichTextBox1.SelectionColor = foreColor
                           RichTextBox1.SelectionBackColor = backColor
                           RichTextBox1.SelectionStart = RichTextBox1.TextLength
                       End Sub
                    )
                )
                length = Await reader.ReadAsync(buffer, 0, buffer.Length)
            End While
        End Function
    End Class

違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■34639 / 親記事)  ToolStripStatusLabelの空白部分を埋めたい
□投稿者/ FireFairy 一般人(3回)-(2021/02/05(Fri) 09:19:49)
  • アイコン環境/言語:[Win10,VB.NET,.NET3.5] 
    分類:[.NET] 

    お世話になります。

    首記の件につきまして、添付画像のように右側に余分な空白(赤線)があって困っています。
    どの設定を変更すればよろしいでしょうか?
    もしかしたら親コントロールのToolStripの設定変更が必要でしょうか?

    *****変更した設定箇所*****
    [ToolStripStatusLabel]
    Spring: False→True

    ※他の設定値については初期値のままです
372×35 => 250×23
イメージ
1612484389.png
/1KB
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■34640 / ResNo.1)  Re[1]: ToolStripStatusLabelの空白部分を埋めたい
□投稿者/ Hongliang 大御所(596回)-(2021/02/05(Fri) 11:27:26)
  • アイコンそのToolStripSTatusLabelを格納しているStatusStripのMarginプロパティによるものと思われます。
    ただしデザイナではMarginプロパティを正しく設定できないみたいなので、FormのLoadイベント辺りで以下のようにしてみてはどうでしょうか。
    StatusStrip1.Padding = New Padding(0)
違反を報告
引用返信
■34641 / ResNo.2)  Re[2]: ToolStripStatusLabelの空白部分を埋めたい
□投稿者/ FireFairy 一般人(4回)-(2021/02/05(Fri) 15:39:00)
  • アイコン2021/02/05(Fri) 15:41:48 編集(投稿者)

    ありがとうございます!

    解決できました!


    デザイナではPadding設定項目が無いのでコードで反映するしかありませんね。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -

2021/02/28(Sun) 19:28:05 に作成されたキャッシュを表示しています。
生のデータを表示する | キャッシュを最新にする