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

遅延バインディングを使用した際、二度目の実行でエラー

環境/言語:[Windows7 VB.NET .NET 2.0]
分類:[.NET]

2011/12/13(Tue) 16:36:27 編集(投稿者)

こちら
http://dobon.net/vb/dotnet/deployment/editwidbprogrammatically.html
を参考に、セットアッププログラムの編集ソースを組んでいます。

VS2010のVBで組んでいます。

起動時、1度目は簡単にMSIのファイル編集は通過するのですが、プログラムを閉じずに2度目を実行すると、WindowsInstallerのOpenDatabaseで

System.Runtime.InteropServices.COMException はハンドルされませんでした。

のエラーが発生します。

ネットで検索してみると、遅延バインディングが影響しているか、と言うところまでは探してみたのですが、対応策が今ひとつ出て来ません。
(対応策っぽいことを書いているページがあって試してみたりもしたのですが、駄目でした)

何か良い方法をご存知のかた、おられましたら教えていただければ、と思います。
System.Runtime.InteropServices.COMExceptionの例外が出ているとの事ですが、
例外のメッセージは何ですか?
あと、COMの解放はやっていますか?
単にファイルが開いたままになっていて、二度目に開こうとしてすでに開かれているとしてエラーになっていると言うことは…ないですよね?

念のため、一度目にファイルを開いてから二度目にファイルを開くまでの間にやっていることを文章なり、箇条書きなり、簡略したソースコードなりで共有すると問題がわかりやすくなると思います。
2011/12/14(Wed) 09:52:01 編集(投稿者)

シェリーさん、Azuleanさん

ご返信、ありがとうございます。

例外のメッセージと言うと、これになるのかどうかわかりませんが
Message=OpenDatabase,DatabasePath,OpenMode
と出ています。
最終の場所は
場所 System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
となっています。

COMの解放は、DatabaseはNothing、InstallerはSystem.Runtime.InteropServices.Marshal.ReleaseComObjectを行なって解放する処理を記述しています。

処理の流れとしては
Installerを遅延バインディングで設定したクラスで型キャストして生成

Installer.OpenDatabaseをトランザクトモードで実行したオブジェクトをDatabaseに格納

MSIにテーブルを追加

Databaseをコミット

DatabaseをNothing

InstallerをSystem.Runtime.InteropServices.Marshal.ReleaseComObjectで解放

となっています。

明示的にクローズするのがコミットで事足りているのかどうか、と言う部分も自分の中では疑問に思っています。

■No29488に返信(Azuleanさんの記事)
> 単にファイルが開いたままになっていて、二度目に開こうとしてすでに開かれているとしてエラーになっていると言うことは…ないですよね?
>
> 念のため、一度目にファイルを開いてから二度目にファイルを開くまでの間にやっていることを文章なり、箇条書きなり、簡略したソースコードなりで共有すると問題がわかりやすくなると思います。
InstallerをMarshal.ReleaseComObjectしているとのことですが、
この時の戻り値はどうなっていますか?
また、InstallerをMarshal.ReleaseComObjectしているのであれば、
databaseもMarshal.ReleaseComObjectが必要なのではないでしょうか?

Databaseのコミットとクローズについては勉強不足で分かりません。ごめんなさい。
シェリーさん

ご返信、ありがとうございます。

ReleaseComObjectの戻り値は0となっているので正常終了しているのだと思われます。

Database側でもReleaseComObjectを実行してみた結果は同じく二度目ではOpenDatabaseで異常終了してしまっています。

■No29490に返信(シェリーさんの記事)
> InstallerをMarshal.ReleaseComObjectしているとのことですが、
> この時の戻り値はどうなっていますか?
> また、InstallerをMarshal.ReleaseComObjectしているのであれば、
> databaseもMarshal.ReleaseComObjectが必要なのではないでしょうか?
>
> Databaseのコミットとクローズについては勉強不足で分かりません。ごめんなさい。
こんばんは。

>Database側でもReleaseComObjectを実行してみた結果は
ということでInstallerとDatabaseは解放させたようですが、
OpenViewをしているとしたら、
view.Closeの呼び出しと
System.Runtime.InteropServices.Marshal.ReleaseComObject(view)
は行っていますか?
とん。さん

ご返信、ありがとうございます。

viewのクローズはしておりました。
ただ、ReleaseComObjectはviewに対して実施していませんでした。

その結果、かけてやると無事動いているように見えます。

ありがとうございます。

■No29492に返信(とん。さんの記事)
> こんばんは。
>
> >Database側でもReleaseComObjectを実行してみた結果は
> ということでInstallerとDatabaseは解放させたようですが、
> OpenViewをしているとしたら、
> view.Closeの呼び出しと
> System.Runtime.InteropServices.Marshal.ReleaseComObject(view)
> は行っていますか?
解決済み!

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