none
VisualC#からのCOM形式のDLLの呼出し及び安定性について RRS feed

  • 質問

  • 現在、VisualC#2008を使用してを開発環境にして

    COM形式のDLLを参照追加して、アクセスする

    アプリケーションを作成しております。

    その中で繰り返し使用していると問題が発生しています。(毎回発生するわけではなく、数回に1回程度)

    例外エラーとして

    System.Runtime.InteropServices.COMException (0x80020009):

    が発生します。

    VisualC#とCOM形式のDLLで相性等何か、参考になる事があれば教えてください。

    2014年10月17日 0:03

回答

  • 以前 COM形式のDLL(対応環境 VB6SP5!)を VB.NET/C#で使って開発してたことがありました。

    数年掛りで開発・運用してたので、運用過程で Visual Studio は 2008 から 2013 へと段階的に遷移し、その間 .NET Framework も3.5 から 4.0 へ移行、当初 Forms で開発してたのが WPF への移行に伴い二つのアーキテクチャ上で稼動させることになり、また上記COMコンポーネントを一時期 IIS でサーバー上で動かしてたこともありました。さらにクライアントOSも、XP・Vista・7・8・8.1 と多岐に渡りました。

    以上の開発/運用過程の中で ReleaseComObject の使い方を間違えて System.Runtime.InteropServices.COMException が発生したことはありますが、それ以外では System.Runtime.InteropServices.COMException に遭遇したことはありません。

    ・・・というわけで、私のほうではいままで特に「相性」を感じたことはありません。(別の意味での相性の悪さなら感じますが・・・苦笑)

    推測するに、Hongliang さんが仰るとおりその「COM形式のDLL」自体に問題があるか、もしくは実装方法に問題があるのではないかと思います。問題になっている「COM形式のDLL」が何なのかを開示されると、さらに情報が集まるかもしれません。


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年10月17日 2:18
    モデレータ
  • 0x80020009はDISP_E_EXCEPTIONだそうで、参考にならないエラーコードですねー。

    問題は多分そのDLL固有のものなので、話をCOM全般に広げても役には立たないと思いますよ。
    2014年10月17日 0:23
  • 正直その「COM形式のDLL」の詳細が不明なため、なんとも言い様がありません。ReleaseComObject に関しては、以下の記事どおり、意識して管理されていれば問題ないかと思います。

    COM オブジェクトの参照カウントを解放する


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年10月17日 3:00
    モデレータ
  • 目的のわからないSleep()が必要になる時点で怪しいです。Hongliangさんと同意見でDLLそのもののバグに1票です。
    2014年10月17日 4:59

すべての返信

  • 0x80020009はDISP_E_EXCEPTIONだそうで、参考にならないエラーコードですねー。

    問題は多分そのDLL固有のものなので、話をCOM全般に広げても役には立たないと思いますよ。
    2014年10月17日 0:23
  • 以前 COM形式のDLL(対応環境 VB6SP5!)を VB.NET/C#で使って開発してたことがありました。

    数年掛りで開発・運用してたので、運用過程で Visual Studio は 2008 から 2013 へと段階的に遷移し、その間 .NET Framework も3.5 から 4.0 へ移行、当初 Forms で開発してたのが WPF への移行に伴い二つのアーキテクチャ上で稼動させることになり、また上記COMコンポーネントを一時期 IIS でサーバー上で動かしてたこともありました。さらにクライアントOSも、XP・Vista・7・8・8.1 と多岐に渡りました。

    以上の開発/運用過程の中で ReleaseComObject の使い方を間違えて System.Runtime.InteropServices.COMException が発生したことはありますが、それ以外では System.Runtime.InteropServices.COMException に遭遇したことはありません。

    ・・・というわけで、私のほうではいままで特に「相性」を感じたことはありません。(別の意味での相性の悪さなら感じますが・・・苦笑)

    推測するに、Hongliang さんが仰るとおりその「COM形式のDLL」自体に問題があるか、もしくは実装方法に問題があるのではないかと思います。問題になっている「COM形式のDLL」が何なのかを開示されると、さらに情報が集まるかもしれません。


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年10月17日 2:18
    モデレータ
  • 返信ありがとうございます。

    DLL自体は、一般的なものではないので、開示は控えたいと思います。

    >以上の開発/運用過程の中で ReleaseComObject の使い方を間違えて

    とありますが、下記のように使用しているのですが、問題ないでしょうか?

    ソースコードは以下のような感じです(抜粋)

      WmSAFPLib.ADspSAFP dataSAFP = new ADspSAFP();

      dataSAFP.ConfigFile = IniFile;
       System.Threading.Thread.Sleep(500);
       dataSAFP.LoadDriver(DriverFile);          ⇒ ここでエラーが発生します。
       System.Threading.Thread.Sleep(500);

      System.Runtime.InteropServices.Marshal.ReleaseComObject(dataSAFP);

     

     

    2014年10月17日 2:38
  • 正直その「COM形式のDLL」の詳細が不明なため、なんとも言い様がありません。ReleaseComObject に関しては、以下の記事どおり、意識して管理されていれば問題ないかと思います。

    COM オブジェクトの参照カウントを解放する


    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx

    2014年10月17日 3:00
    モデレータ
  • 目的のわからないSleep()が必要になる時点で怪しいです。Hongliangさんと同意見でDLLそのもののバグに1票です。
    2014年10月17日 4:59