- - PR -
起動中アプリケーションに対しての処理について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-04 22:27
Ensuring that only a single instance of a .NET application is running に、
というくだりがあります。 しかし、例文には Close がないですね... IDE 上で実行した場合は起きにくいというのもちょっと謎ですが... _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-04 22:55
この組み合わせを検索したところ、本家でこんな記事を発見しました。 二重起動を禁止する方法について これもおかしいですね。 私の記事は 1 年ほど前に書いた記事で、本家の記事の最終更新日は、2005年6月30日... うーん、ま、まさかね... (^^;) # エントリ ポイントには珍しい Protected 修飾子... # その他諸々を見て、考えてはいけないことを考えてしまいました。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-04 23:06
わ、笑ってしまいました… それはさておき、
ですが、要するに最初でしかMutexへの参照を行っていないため、JITコンパイラが 勝手にローカルの参照を削除してしまい(厳密な表現はよく分かりませんが)、 GCの対象になってしまうので、KeepAliveを最後に入れる必要があるということかなと 思いました。 なんで、CloseがあればそれがKeepAliveの代わりを果たしている(この時点でメソッド 呼び出しのために直接参照が必要になるのだから、GCの対象にしてはならないのは 明らか)ので、特にKeepAliveで明示する必要はないと。 ※ていうか、これで問題が起こるのならかなりおかしいバグということに… 状況によって問題が起こったり起こらなかったりするというのは、JITの最適化やら何やらで動作が変わってしまうからでしょう。 | ||||||||||||||||
|
投稿日時: 2005-12-04 23:30
これ... 私から報告しときますね... (^-^A)
はい、GC の対象となることがあるようで、それを防ぐためのものですね。
Close メソッドではダメだったということなのかどうかは判りませんが、 安全性などから採用しているのかもしれません。(Google の検索結果を見る限り)
IDE 上ではなく実行ファイルから実行した方が起こりやすいというのも、そういうことなのでしょうね。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||||||
|
投稿日時: 2005-12-05 06:19
で、解決したの? ってか、原因はわかっているんだから、解決したんだよね? (メソッドに渡すところで new しているから、メソッドに渡すところの外で捕まえられないんだから、作ってから渡せばいいよね?) ___________________________________________________________________ □ written by Jitta on 2005/12/05 □ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||||||||||||||
|
投稿日時: 2005-12-05 12:32
回答ありがとうございます。
解決はまだしておりません。 作ってから渡すという処理が出来ません。 MainWindow のApplication.Runに渡しているインスタンスを Sub Mainのローカル変数などに一旦生成して その生成したインスタンスをApplication.Runに渡したとしても 2回目以降に起動したプロセスから どのようにして初回起動時のApplication.Runに渡したインスタンスを 取得するのがわかりません。 .NET Remoting については調べている最中です。 | ||||||||||||||||
|
投稿日時: 2005-12-05 21:32
済みません、寝ぼけてました。
.NET では、アプリケーションドメイン間通信を使うように、ということのようです。手っ取り早く、用意されているもので間に合わせるなら、TCP 通信をするアプリケーションを作成することになります。 その他、自分で API 呼び出しをするなら、メッセージとか。 ___________________________________________________________________ □ written by Jitta on 2005/12/05 □ Microsoft MVP for Visual Developer ASP/ASP.NET Oct.2005-Sept.2006 _________________ | ||||||||||||||||
|
投稿日時: 2005-12-07 22:44
回答ありがとうございます。
.Net Remotingを調べていたのですが、奥が深いようで理解することが出来ませんでした。 そのためAPIを使用して多重起動した時にMainWindowに対してSendMessageでクリックメッセージを送信し、MainWindow側ではクリックイベントで新規作成処理を行うようにしたら無事に目的の動作をすることが出来ました。 MainWindowのハンドルを取得する処理にAPIのFindWindowを使用しているため少し不安が残りますが、今回はOKとしました。 .Net Remotingを使用することにより、 PC内でのプロセスを越えたメソッド呼び出しが出来そうなのは、わかりました。 しかし、具体的な処理が理解できなかったため今後の課題にしたいと思います。 皆さんのおかげで本来の目的とは違うMutexの扱いについても勉強できました。 ありがとうございました。 |