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

アプリケーションの再起動

環境/言語:[VB.NET 2010, Windows 7]
分類:[.NET]

以前はマック用のソフトを作成していて、去年の10月末からVB.NETで簡単なアプリケーションを作っています。

さて、題目にもある通り、アプリケーションの再起動に関する質問があります。マックの場合だと、簡単なアプリケーションの再起動に関しては、AppleScriptでつくったプログラムを利用することで問題なくそれができます。ウィンドウズの場合だと。。。インターネットを検索すると、

Application.Restart()

で現在使っているアプリケーションを簡単に再起動できるという、ということを幾つかのウェブサイトで目にします。以前にも何度か試してみましたが、自分がこれを使うと、やはりアプリケーションが終了するだけで再起動はしません。どこかでVB2002かVB2005以降で使える、という書き込みを見かけたと思いますが。またmutexを使っていると再起動がうまくできないかも、という書き込みもでこかにありましたね。もう一つどこかで再起動のコードを見かけましたが、やはりアプリケーションの終了で終わってしまいます。さて現在使っているのは、

Try
Process.Start(Application.ExecutablePath)
End
Catch ex As Exception
End
End Try

です。これで殆どの場合アプリケーションを再起動することができます。ただ時たまアプリケーションが終了したままで、数秒後にシステムが「XXX has stopped working」というメッセージを表示し、プログラムを終了するかどうかきいてきます。(英語のシステムを使用。XXXはアプリケーションの名前。)つまり100%再起動できる方法ではないので困っています。

アプリケーションの再起動の理由ですが、バックアップ・ファイルを読み込んだ後にデータを更新する時などに必要としています。

以上宜しくお願いします。
参考になるかわかりませんが、Mutex の問題や、だんまりの問題があるため、私の場合は起動時にシャドウを作成してそちらを起動する手法をとっています。
■No30785に返信(じゃんぬねっとさんの記事)
> 参考になるかわかりませんが、Mutex の問題や、だんまりの問題があるため、私の場合は起動時にシャドウを作成してそちらを起動する手法をとっています。

返信をありがとうございます。シャドウですか。ちょっと自分にはそれを扱えるほどのVB.NETの知識がまだないです。
■No30786に返信(寛吉さんの記事)
> ■No30785に返信(じゃんぬねっとさんの記事)
>>参考になるかわかりませんが、Mutex の問題や、だんまりの問題があるため、私の場合は起動時にシャドウを作成してそちらを起動する手法をとっています。
>
> 返信をありがとうございます。シャドウですか。ちょっと自分にはそれを扱えるほどのVB.NETの知識がまだないです。

VB.NET の知識というか、一種のアーキテクチャですね。
たとえば ASP.NET でも使われています。
ASP.NET はこのシャドウ コピーによってオンデマンドにアセンブリが更新できるわけです。
参考リンク (このとおりにすれば解決するよという意味のリンクではありません)
http://msdn.microsoft.com/ja-jp/library/ms404279(v=vs.80).aspx

それと、前回書き忘れていたのですが Application.Restart メソッドは、間接実行 (ClickOnce を通じて実行する等) しているアセンブリのためのものです。
よく考えてみたら何が問題なのかわかりました。MacでAppleScriptを使った再起動の方法だと、「このアプリケーションを1/2秒後に再起動して」というCallをAppleScriptに送り、そして本アプリケーションを終了します。結局同じ様なことをウィンドウでもやれればいいのでしょうが。

Try
Process.Start(Application.ExecutablePath)
End
Catch ex As Exception
End
End Try

上のコードだと「単一インスタンスのアプリケーションを作成する」と相反してしまうのでしょうね。
■No30789に返信(寛吉さんの記事)
> よく考えてみたら何が問題なのかわかりました。MacでAppleScriptを使った再起動の方法だと、「このアプリケーションを1/2秒後に再起動して」というCallをAppleScriptに送り、そして本アプリケーションを終了します。結局同じ様なことをウィンドウでもやれればいいのでしょうが。
>
> Try
> Process.Start(Application.ExecutablePath)
> End
> Catch ex As Exception
> End
> End Try
>
> 上のコードだと「単一インスタンスのアプリケーションを作成する」と相反してしまうのでしょうね。

それは最初の投稿ですでにご存じかと思っていたのですが...
まあ、ということですので、シャドウ コピーを作成するという私の最初の投稿に loop します。
アセンブリが別になるので、アプリケーション フレームワークの単一のインスタンスとも競合しません。
■No30790に返信(じゃんぬねっとさんの記事)
> ■No30789に返信(寛吉さんの記事)
>>よく考えてみたら何が問題なのかわかりました。MacでAppleScriptを使った再起動の方法だと、「このアプリケーションを1/2秒後に再起動して」というCallをAppleScriptに送り、そして本アプリケーションを終了します。結局同じ様なことをウィンドウでもやれればいいのでしょうが。
>>
>>Try
>>Process.Start(Application.ExecutablePath)
>>End
>>Catch ex As Exception
>>End
>>End Try
>>
>>上のコードだと「単一インスタンスのアプリケーションを作成する」と相反してしまうのでしょうね。
>
> それは最初の投稿ですでにご存じかと思っていたのですが...
> まあ、ということですので、シャドウ コピーを作成するという私の最初の投稿に loop します。
> アセンブリが別になるので、アプリケーション フレームワークの単一のインスタンスとも競合しません。


助言ありがとうございます。シャドウを使う、と言ってもちょっとどんなコードを書いたらいいのかもわかりません。The Code Project (http://www.codeproject.com/Articles/29961/Shadow-Copying-of-Applications) で関連する様なものを見つけましたが果たしてVB.NETに応用できのか。。。「domain」という変数がでてきますがこれが何なのかもちょっとわからないですし。
■No30795に返信(寛吉さんの記事)
> ■No30790に返信(じゃんぬねっとさんの記事)
>>■No30789に返信(寛吉さんの記事)
> >>よく考えてみたら何が問題なのかわかりました。MacでAppleScriptを使った再起動の方法だと、「このアプリケーションを1/2秒後に再起動して」というCallをAppleScriptに送り、そして本アプリケーションを終了します。結局同じ様なことをウィンドウでもやれればいいのでしょうが。
> >>
> >>Try
> >>Process.Start(Application.ExecutablePath)
> >>End
> >>Catch ex As Exception
> >>End
> >>End Try
> >>
> >>上のコードだと「単一インスタンスのアプリケーションを作成する」と相反してしまうのでしょうね。
>>
>>それは最初の投稿ですでにご存じかと思っていたのですが...
>>まあ、ということですので、シャドウ コピーを作成するという私の最初の投稿に loop します。
>>アセンブリが別になるので、アプリケーション フレームワークの単一のインスタンスとも競合しません。
>
>
> 助言ありがとうございます。シャドウを使う、と言ってもちょっとどんなコードを書いたらいいのかもわかりません。The Code Project (http://www.codeproject.com/Articles/29961/Shadow-Copying-of-Applications) で関連する様なものを見つけましたが果たしてVB.NETに応用できのか。。。「domain」という変数がでてきますがこれが何なのかもちょっとわからないですし。

AppDomain はアプリケーション ドメインのことです。
.NET のアセンブリはアプリケーション ドメイン上で動いており、ロードされたアセンブリのリリース方法は、そのアプリケーション ドメインをアンロードすることが唯一となります。
(という内容は、2 つ前に投稿したリンクにも書かれているので、概念は理解しておいて頂けたらなぁ... と淡い希望)

Code Project のコードは検証していませんが、VB にコンバートすれば良いのではないでしょうか。
こちらの掲示板の管理者であるどぼん! さんがまとめた記事がせっかくあるのでご一読されてはいかがでしょうか?
http://dobon.net/vb/dotnet/links/convertcs2vb.html

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