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

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

記事リスト ( )内の数字はレス数
NomalWindowsMediaPlayerで次のURLを指定しても反映されない。(2) | Nomal"−"を縦書きにしたい(9) | Nomal.NET6.0 のWinFormにWPFのユーザーコントロールを配置したい(4) | NomalDataGridViewの列にコンボボックスを表示する(2) | Nomalデータグリッドビューの特定の列ヘッダの色(2) | NomalVB-Report10→11への移行(4) | Nomalデフォルトプリンタの用紙向き変更(0) | NomalASP.net デバッグ時の .js ファイルの変更が反映されない(1) | NomalpictureBoxとlabelの重ね合わせ(2) | NomalWindowsエクスプローラへのドロップ先フォルダの取得(4) | Nomal入力値を元に描画させたい(2) | NomalVBで開いたExcelでのイベントを取得するには(4) | NomalデザイナでSystemColorsのような色一覧から選択できるようにしたい(0) | NomalTaskの入れ子の待ち方2(4) | NomalTaskの入れ子の待ち方(5) | NomalVisualStudio2019 以降の検索ダイアログが正常に動作しない(2) | NomalUsingの使い方が間違っている?(4) | Nomal//./の意味は?(2) | Nomalバイナリーファイルの結合と分解(2) | NomalVSTOとWebView2の共存って可能?(2) | Nomal表の最後の行の下にDropできない(1) | NomalCookieの勉強を始めました。(2) | NomalDataGridViewの特定セルにボタンを配置する方法(3) | NomalDataGridViewのセル結合部分にボタンを表示する方法(3) | Nomal複数のPageに分かれる場合のスクレ―ピング(6) | NomalTask.Runの使い方(4) | NomalPictureBox のサイズを設定する(2) | NomalProcessクラスMainModuleプロパティでアクセス拒否(3) | NomalLINQでControlsをEnable=Falseに設定(3) | Nomalランダムファイルを高速化させたい(5) | Nomalプロセス間の通信(相互)(2) | NomalC#をVBに変換する方法が分かりません(1) | NomalPictureBoxに動的に画像を表示する(1) | NomalYahooのHPで、検索文字の入力ができない(3) | NomalWebView2のEncodeの問題?(5) | NomalWinFormでChromeをSeleriumで操作しているが、Closeの仕方(2) | Nomal印刷部数の固定(1) | NomalWinformでのDataGridView Comboboxのデータ追加削除が出来ない(3) | Nomalプログラムについて。(2) | Nomal拡張子関連付けのサンプルで削除時 例外発生(1) | Nomalユーザーコントロールをフォームで使用した時のエラー(6) | NomalマルチページTIFFをSelectActiveFrameでページ指定するとエラーが発生する(12) | Nomal画像の大きさを取得するには(4) | Nomalファイルがドライブ内で占有する容量(3) | NomalC#FormのXボタンイベントで、e.Cancel が使えない(2) | NomalAxWindowsMediaPlayerでプレイリストの途中から再生するには(2) | NomalWebView2でJavaScriptの実行の終了イベント(4) | NomalDataTableのDataRowVersion毎のInt型値の比較がうまくいかない(5) | NomalGPTかMBRを判断したい(2) | Nomalアセンブリ言語について。(1) | Nomalマクロについて。(3) | NomalDLL内のスレッドからイベントを発行すると、受信したフォームでラベルが更新できない(3) | Nomalアセンブリ言語について。(20) | Nomalシステムコールについて。(2) | Nomal Parallel.Forで思ったより早くならない(5) | NomalAngleSharp.Scripting.JavaScriptの使い方(2) | NomalDataAdapterで2回目のUpDateが出来ない(6) | NomalForm1イベントの選択が出来なくなりました。(9) | Nomalデザーナー時の継承先formのサイズ(0) | Nomalコンソールではなくテキストボックスに文字列を出力したい(7) | NomalAngleSharpのクエリー文2(4) | Nomalコーディングについて。(3) | Nomaldll修正時、それを参照しているexeのリビルド要否(2) | NomalAngleSharpのクエリー文(2) | Nomalデフォルトプロパティを使いたい(6) | Nomalテキストボックスでの制御(7) | NomalUSBカメラをピクチャボックスに表示(3) | Nomal二次元配列内の文字の置き換え(3) | Nomalcolor型を引数にする方法(2) | NomalVSプロジェクト作成方法の違いによる、プラグイン機能を持つアプリケーションへの影響について(6) | NomalInputボタンが押せない(4) | NomalWebBrowserのDocumentCompletedイベントの切り替え(3) | NomalEndConnectでのエラー(2) | Nomalボタンクリック時のLeaveイベントについて(1) | Nomalエクセルのデータを配列に読込んだ時の配列要素番号について(2) | Nomalorder by で抽出したデータをDataTableに入れてForEachでDataRow取得した際の順番(2) | Nomal非同期プログラミング時のConsole.WriteLineの動作(4) | NomalC#からストアドにDecimalを渡すと値が丸められる(4) | Nomalインスタンスの型を文字列で指定したい(2) | NomalSendKeys.Sendが効いていない(2) | Nomal他のプロジェクトのコントロールがツールボックスに表示されない(3) | Nomal複数のテキストボックス間のTextChangedイベントが相互干渉しないようにしたい(9) | Nomal呼び出し元によってWebApi側の処理速度に差が出る(1) | NomalPanelのDock=Topだとうまくいかない。代替案。(2) | Nomal.NetでのIPv6の比較(5) | Nomal.Net 5.0 におけるDLL参照問題?(7) | Nomal追加コントロールのtabindex値を既存の間に設定する方法(1) | NomalVB.net非同期処理でtextboxに出力したい(2) | NomalToolStripStatusLabelの空白部分を埋めたい(2) | NomalOracle への OleDb 接続に失敗する(3) | Nomal正規表現で株価を取得したい(1) | NomalVB.NETで作成したDLLをVB6.0から呼び出す(3) | Nomalデザイナで編集・チェックアウトキャンセルすると(3) | Nomal親スレッドへ処理の移譲(7) | NomalクラスによるGetBytes関数のエンディアンの違い(2) | Nomal[VB.NET]Excelのプロセスが終了しない(2) | NomalC#をVBに変換した際の強制的な参照渡し(2) | Nomal.Net 5.0 におけるServiceControllerの代替クラス(3) | Nomal新たにshowしたフォームでのボタンのクリック(5) | NomalVB.NETからRDゲートウェイを利用したリモートデスクトップ接続(4) |



■記事リスト / ▼下のスレッド
■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]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■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]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■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]



■記事リスト / ▲上のスレッド
■34635 / 親記事)  Oracle への OleDb 接続に失敗する
□投稿者/ kane123 一般人(1回)-(2021/01/29(Fri) 11:40:12)
  • アイコン環境/言語:[Windows 10 VB.net .net Framework 4.0] 
    分類:[.NET] 

    とあるOracleデータベースに接続を試みていますがうまくいきません。

    VB.net / OleDbで接続を試みています。

    今まで接続に成功したOracleDBの場合は、接続文字列は:

     Provider=OraOLEDB.Oracle.1;Data Source= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST= [HostName] )(PORT = 1521)) ) (CONNECT_DATA= (SERVICE_NAME = [ServiceName] ) ));User ID=xxxx;Password=xxxx;

    として成功していました。今回接続に失敗しているDBでは、上記の情報のうち、[ServiceName]が分からず、[HostName]、userID、Passwordのみが情報として持っているものになります。従って、[ServiceName]には暫定的に orclを入れていますが、これ自体が正しいのかは分かりません。

    フリーソフトの A5M2 を使用した場合は、当該DBへの接続に成功しており、
    その際「Oracle Client 不使用」の接続で成功しています。
     A5M2の接続情報入力では [HostName]、userID、Password
    の3つの情報だけを求めら、これらを入力すれば接続成功するので、同様なことを OleDbで行いたいのにできず困っております。

     また、接続できない場合のエラーメッセージは
    「ORA-12545: ターゲット・ホストまたはオブジェクトが存在しないため、接続に失敗しました(TNS-12545)」

     というものなので、上記の[HostName]の箇所がDNS名になっていることが原因かな、というのも
    あります。ただそうだとすれば、なぜA5m2がHostName を指定しただけで名前解決に成功しているのか、
    つじつまが合わず、不可解に思われます。

    ご教示いただければ幸いです。

    目指しているゴールは基本的に [HostName]、userID、Password だけを用いたOleDbドライバ向けの接続文字列の作成
    となります。 これとは別個に名前解決の問題もあるのであればその解決法も探っていきたいという感じです。





違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■34636 / ResNo.1)  Re[1]: Oracle への OleDb 接続に失敗する
□投稿者/ kane123 一般人(2回)-(2021/01/29(Fri) 11:52:54)
  • アイコンExcel VBA で下記の接続文字列を使用したところ、ドライバは ADODB ですが接続に成功しました。
    この接続文字列がそのまま OleDbで使えるか検証してみようと思います。
    ( もし、それで成功した場合は自己解決となり、申し訳なく思いますが、ご容赦願います。 )


    Dim con As New ADODB.Connection
    con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=[HostName];" & _
    "User ID=xxxxx;Password=xxxxx;"
    con.Open
違反を報告
引用返信
■34637 / ResNo.2)  Re[2]: Oracle への OleDb 接続に失敗する
□投稿者/ 魔界の仮面弁士 大御所(1312回)-(2021/01/29(Fri) 19:24:29)
  • アイコン2021/01/29(Fri) 19:40:14 編集(投稿者)

    No34636に返信(kane123さんの記事)
    > Excel VBA で下記の接続文字列を使用したところ、ドライバは ADODB ですが接続に成功しました。

    それで繋がるということは…クライアント上の tnsnames.ora ファイルを
    メモ帳などで開いてみることで、必要な接続記述子を得ることが出来ると思いますよ。
    https://www.shift-the-oracle.com/oracle-net/tnsnames.html

    もしも Oracle Client (≠Oracle Instant Client) を導入済みであれば
    コマンドラインで「TNSPING HostName」を実行してみてください。
    tnsnames.ora の内容を読み取って表示し、疎通確認まで行ってくれます。
    ※上記の `HostName` の部分は、実際のネットサービス名に差し替えます。


    それと、最初の質問の HOST= [HostName] の HostName と、
    その次の投稿の Data Source = [HostName] の HostName は本来別物です。
    (今回はたまたま同じ名前に設定してあったのだと思います)


    > con.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=[HostName];" & _

    クライアントに tnsnames.ora ファイルが設置されている場合には、
     Data Source=ネットサービス名;
    の構文で済みます。

    tnsnames.ora が無い場合には、EZConnect (簡易接続ネーミングメソッド)で
     Data Source=サーバー名またはIPアドレス/サービス名;
     Data Source=サーバー名またはIPアドレス:1521/サービス名;
    の構文を使えます。
    https://docs.oracle.com/cd/F19136_01/ntcli/specifying-a-connection-by-using-the-easy-connect-naming-method.html


    ただし複数の記述子やアドレスリストが必要な場合には、
    EZConnect では指定できないので、最初の質問のような長い記述を使うか、
    あるいは tnsnames.ora を用意することになりますね。
    https://docs.oracle.com/cd/E16338_01/network.112/b56287/tnsnames.htm


    なお、ADODB ではなく、ODP.NET Managed Provider で繋ぐ場合には
    tnsnames.ora 相当の記述を、アプリごとの app.config あるいは web.config 内に
    埋め込んでおくことも出来ます。
違反を報告
引用返信
■34638 / ResNo.3)  Re[3]: Oracle への OleDb 接続に失敗する
□投稿者/ kane123 一般人(3回)-(2021/01/30(Sat) 17:57:28)
  • アイコンありがとうございます。

    解決することができました。

    tnsnames.ora の存在を忘れておりました。。
解決み!
違反を報告
引用返信

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






Mode/  Pass/


- Child Tree -