質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

1803閲覧

C#からVBSのErrにメッセージを返せない

takenoko01

総合スコア4

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2020/01/28 09:58

前提・実現したいこと

VBScriptからC#のEXEを実行する処理を作っているのですが、
C#の終了方法ないしエラー処理の方法の知識が足らず、
例外発生時にVBScriptにエラーを返すことができず困っております。

<実現したいこと>
|VBScript
| Shell等-->
| C#のEXE
| (処理:DBからデータ取得してCSVを作る等)
| 「xx行目の値が不正」等の動的なエラーメッセージ
| <--呼出元にメッセージを返す
| Err.Description でメッセージ受取
| ユーザーにメッセージ通知

探し方が悪いのか、数時間検索致しましたが解決する情報が見つけることができず、
ご教示いただけないでしょうか。
宜しくお願い致します。

発生している問題・エラーメッセージ

C#の実行結果(エラーメッセージ)をErr.Descriptionで受け取りたいです。

該当のソースコード

C#

1public partial class App : Application 2{ 3 protected override void OnStartup(StartupEventArgs e) 4 { 5 //いくつかの組み合わせで試行したが効果なし 6 //System.Environment.Exit(-1); 7 //throw new System.Exception("testErrorTest"); 8 //System.Console.WriteLine("あいうえお"); 9 //System.Console.Error.WriteLine("かきくけこ"); 10 //System.Console.SetError(System.Console.Error); 11 12 System.Environment.ExitCode = -1; 13 this.Shutdown(); 14 } 15}

VBScript

1'テストソース 2Option Explicit 3Dim wsh 4Dim rtn 5Set wsh = CreateObject("WScript.Shell") 6On Error Resume Next 7rtn = wsh.Run("C:\…\C#の.exe", 1, True) 8MsgBox "<" & rtn & "," & Err.Number & ">" & Err.Description 9 '「<-1,0>」が表示される 10On Error GoTo 0 11Set wsh = Nothing 12WScript.Quit (0)

試したこと

上記ソースコードを試行しました。

補足情報(FW/ツールのバージョンなど)

C#ソースは抜粋です。
VisualStudio2017 WPFアプリ(.NET Framework) で作ったプロジェクトで、
App.XamlのStartupUriを削除しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/01/28 10:09

Run ではなく Exec を使ってみてください。C# の方を COM 公開するという手もあります。
takenoko01

2020/01/28 12:38

Zuishin 様、 早速のご回答ありがとうござます。 Execについては、Err.Description に値が返らないものの、この方法で回避できる事を確認いたしました。 ```VBScript Set objExec = wsh.Exec("...\C#の.exe") Do While objExec.Status = 0 WScript.Sleep 100 '終了待ち Loop MsgBox "<" & objExec.ExitCode & ">" & objExec.StdErr.ReadLine ``` COM公開は…機能を存じておりませんでした。MicrosoftDocsをちら見いたしましたが、 実現するにはCOM公開、クライアントPCへのインストールも嫌うなら「登録を必要としないアクティベーション用の...」 という記事の方法になるのでしょうか。 .Net以外の処理も類似するScriptから呼び出す関係で、一律の記述でエラー処理できるのが理想なのですが、 難解すぎるかもしれません。。 ひとまずMicrosoftDocsを詳しく読みたいと思います。 ありがとうございました。
dodox86

2020/01/29 01:07

Zuishinさんが提示されたExecを使う方法は簡単で良い方法だと思います。(私はその発想はなかった)いったんExecでC#の実行プログラムが出力する内容を受け取り、適当にメッセージを編集して、VBS側でRaiseメソッドを使ってErrオブジェクトを投げれば、COMを使わずとも要望を満たせる気がします。(未確認なので、あくまで「気がする」だけですが)
takenoko01

2020/01/29 02:22 編集

dodox86 様、コメントありがとうございます。 一点、勘違いがございました。 通常Err.DescriptionはOS標準のエラーNOに紐づいたメッセージで、 売り物のよくできたソフトウェアの機能を当然と思いこんでいたようです。 昨晩は元の要望に固執したコメントをして失礼致しました。 Zuishin 様のExec案が最善と思われますので、回答欄に転記いたします。 (初投稿ですので、質問の閉め方等マナー違反ございましたらご教示ください)
dodox86

2020/01/29 02:24

質問者さんの最終的なVBScriptプログラムでは、全般を通して"On Error .."を用いてエラーハンドリングを行いたいのかな、と思いました。ですので、外部プログラムの実行結果をErrオブジェクトで把握したいのが要望で、VBScript/VBAの技術的な視点で言えばそのような質問もありだと思い、個人的にご質問を注視していただけですのでだいじょうぶです。
takenoko01

2020/01/30 00:48

技術的に掘り下げる前にCloseしてしまいすいません。 dodox86 様の仰る通り、Err.Description(または一歩手前のErr.Number)にてエラーハンドリングするのを理想としており、 経験の浅い私が知らないだけで、C#に一発で解決する便利な命令等あるのではと期待しておりましたが、、 甘かったと反省しています。
dodox86

2020/01/30 00:58

いえいえ、謝られるほどのことではないです。恐縮させてしまいこちらこそすみません。 > C#に一発で解決する便利な命令等あるのではと期待しておりましたが、、 それを見極める為の質問でもあると思いますので、別に良いのではないでしょうか。少なくとも私にとってはOn Error...、およびErrオブジェクトの関わりを再認識できそうな内容でしたので、良かったです。以上です。
guest

回答1

0

自己解決

Zuishin 様にいただきました施策を転記いたします。

WScript.Shell の Exec でエラーコードと標準エラー出力のメッセージを取得しています。

C#

1public partial class App : Application 2{ 3 protected override void OnStartup(StartupEventArgs e) 4 { 5 System.Console.Error.WriteLine("testError"); 6 System.Environment.ExitCode = -1; 7 this.Shutdown(); 8 } 9}

VBScript

1Option Explicit 2Dim wsh 3Dim rtn 4Dim objExec 5Set wsh = CreateObject("WScript.Shell") 6On Error Resume Next 7Set objExec = wsh.Exec("C:\…\C#の.exe") 8Do While objExec.Status = 0 9 WScript.Sleep 100 '終了待ち 10Loop 11MsgBox "<" & objExec.ExitCode & ">" & objExec.StdErr.ReadLine 12 '「<-1>testError」と表示される 13On Error GoTo 0 14Set wsh = Nothing 15WScript.Quit (0)

ご助言、ありがとうございました。

投稿2020/01/29 02:16

takenoko01

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問