none
突然エラーが発生し、コンパイルできなくなりました RRS feed

  • 質問

  • Hoshinaです
    こんにちは

    先週まで問題なくコンパイルできていたプロジェクトでコンパイルできなくなりました。
    個人の趣味で作成しているもので、本日(6/10日)このエラーに遭遇しました。

    内容は、以下のものです。
    ・開発のマシンは、Windows 10 Pro で 64 ビット OS
    ・開発環境は、Visual Studio Community 2017 
    ・開発言語は C# で WPF アプリケーション

    発生しているエラーは、以下のもの(若干編集してあります)
    ・型または名前空間の名前'mshtml'が見つかりませんでした(using ディレクティブまたはアセンブリ参照が   以下略)

    確認した点は、以下のもの
    ・先週までは、正常のコンパイル、実行、デバッグができていた
    ・既存の参照を削除して、参照の追加(Microsoft HTML Object Library)をしてみましたが、変化なし
    ・新規にプロジェクトを作成して、既存のソースをすべて移行してみたが、変化なし
    ・昨日6/9 までは Windows 7 のほぼ同様な環境で問題がなかった(現時点でどうかは不明)
    ・先週のあるタイミングで、Windows 10 に非常に時間のかかるアップデートがあった
    ・Windows 10 のアップデート後にコンパイルしたのは、これが初めてと思う

    上記のことから、 Windows 10 のアップデートにより、mshtml のライブラリに影響する何らかの変化があったかと思っています。
    コンパイルのエラーをなくし、問題なくプログラムを実行させたいのですが、何か情報をお持ちの方はいませんか?

    Google map を利用したアプリケーションで、この問題が今後も解決不可となったらとても困ります。
    私事ながら、休日以外には迅速な応答と実機での内容確認が出来かねる可能性が高いため、あらかじめご了解ください。

    それでは

    2017年6月10日 2:28

回答

  • Hoshinaです

    原因が分かりました。

    mshtml.IHTMLDocument3 doc   エラー

    MSHTML.IHTMLDocument3 doc   正常(すべて大文字)

    今まで、2週間ほど、上記のままでコンパイルできていましたので、まったく思い及びませんでした。
    コンパイル後、正しくプログラムが動作しています。

    • 回答としてマーク Hoshina 2017年6月13日 7:48
    2017年6月13日 7:47
  • Hoshinaです
    こんにちは

    今日になり変化がありました。

    前回までの結果では、使用する名前空間を mshtml から MSHTML に変更することで、コンパイルすることができるようになったというものです。

    但し、これでは次の問題があります。
    ・使用している DLL によって、ソースファイルに「using mshtml;」「using MSHTML;」の違いがでる

    このために、ソースファイルを統一することができません。
    色々とためそうと思い、Visual Studio を起動しました。

    すると、コンパイル時の警告に
    「このコンピュータには使用できる複数の変換ラッパーが組み込まれており、より機能が豊富かもしれない。
     別のものに切り替えてみますか?」
    このような(正確な文言は記録していませんでした)項目があり、切り替えてみるを選択したところ、

    using mshtml;

    に統一することができました。
    前回までは、このような項目がなかったと思いますが、確かとは断言できません。
    この仕組み自体はわかっていませんが、これで本当にやりたいことが実現できたと思います。

    それでは

    • 回答としてマーク Hoshina 2017年6月16日 22:56
    2017年6月16日 22:56

すべての返信

  • 自分がそうなったらまず、コンパイルの中間ファイルを消してからリビルドしてみるかな?
    (中間ファイルはデフォルトでプロジェクトディレクトリの下の /bin 以下)
    関係なさそうな気がしますが GAC を確認してみるのも
     Visual Studio のコマンドプロンプトで gacutil /l | find "html" を実行
    • 編集済み hihijiji 2017年6月10日 7:24 誤字
    2017年6月10日 7:24
  • Hoshinaです
    こんにちは

    投稿ありがとうございます。
    以下は、投稿前に実施していました。書いておけばよかったですね。

    ・ビルド→クリーン 後に、すべてをビルドは何度もやりました
    ・/bin 以下の削除はやりました

    投稿を受けて、GAC の確認はしてみましたが、きちんと表示されました。

    ちなみに、追加情報として
    ・参照から既存の項目を削除して、再度追加して成功していますので、GAC の存在問題はないと思います
     あるとしたら、 GAC ファイルの破損は考えられます。
     破損の有無の確認方法がありましたら、教えてください
    ・関係あるかどうか不明ですが、SQL Server が自動で起動しませんでした
     サービスを確認すると、「自動」となっていましたが、起動しておらずず、サービスマネージャから起動させました
     それ以降は、OSを再起動しても、自動的に起動しています
    ・問題のソリューションの、.NET のバージョンが 4.5.1(確か?)に変わっていて、最初コンパイル時に問題がありました
     それまでは、 4.6.1 に設定していたものが、かってに変わっていました
     これ以外にも、何か変わってしまった点があるのかもしれません
     (使用している DLL が、4.6.1 でコンパイルしたものを利用しているため)
    ・参照への再追加に、非常に時間がかかったとの印象があります(1分程度はかかった)
     Visual Studio 自体がロックしたのかと疑ったくらいです

    何かお気づきの点がありましたら、指摘ください。

    それでは

    2017年6月10日 23:44
  • Hoshinaです

    役に立つかどうか不明ですが、追加の情報です。

    ソースに、「using MSHTML」を追加してみました。この項目自体は、「using」と入力すると候補にでてきます。
    そうすると、今までのエラー以外に以下の警告が増えました。

    ***ここから***

    COM 参照 "MSHTML" をパス "C:\Windows\SysWOW64\mshtml.tlb" から処理しています。タイプ ライブラリ インポーターでメンバー 'tagSAFEARRAY.rgsabound' の シグネチャを変換できませんでした。

    ***ここまで***

    それでは

    2017年6月11日 0:31
  • Hoshinaです

    さらに、追加の情報です。

    警告は、一度ソースに「using MSHTML」を追加すると出るようになり、それを削除しても出てきます。
    また、別のパターンの警告もあります。(よく似ていると思いますが)

    ***ここから***

    COM 参照 "MSHTML" をパス "C:\Windows\SysWOW64\mshtml.tlb" から処理しています。'IEventTarget2.GetRegisteredEventTypes' の引数のうち少なくとも 1 つをランタイム マーシャラーでマーシャリングできません。  したがってこのような引数はポインターとして渡され、アンセーフ コードの使用が必要になります。

    COM 参照 "MSHTML" をパス "C:\Windows\SysWOW64\mshtml.tlb" から処理しています。タイプ ライブラリ インポーターでメンバー '__MIDL___MIDL_itf_mshtml_0001_0042_0010.hbmpUnchecked' の シグネチャを変換できませんでした。


    ***ここまで***

    何らかの理由で、mshtml が正しく参照できていないと思われます。

    2017年6月11日 0:43
  • 少なくとも当方環境では、新規の WPF プロジェクトに MSHTML を含めてコンパイルできているようです。そちらのソースコードの内容が分からないので、本当に問題ないと言えるのかは自信が無いですが。

    Windows 10 のアップデートにより、mshtml のライブラリに影響する何らかの変化があったかと思っています。

    比較的近い日付で更新があったようですが、影響度合いまでは分かりませんでした。

    手元の環境(Windows 10 Creators Update)で mshtml.dll を確認してみたところ、ファイルバージョンが 11.0.15063.296、ファイル更新日が 2017‎/05/25 01:18:30 になっていました。

    さらに同日付けで C:\Windows.old\ というフォルダーも作成されており、その中にあった "C:\Windows.old\WINDOWS\System32\mshtml.dll" を見てみると、こちらはバージョン 11.0.10586.916、更新日が 2017/04/28 09:05:14 となっていました。

    それぞれのフォルダーには、mshtml.tlb ファイルも配置されていましたが、内容の違いまでは追跡できていません。

    'IEventTarget2.GetRegisteredEventTypes' の引数のうち少なくとも 1 つをランタイム マーシャラーでマーシャリングできません。

    検索してみると、下記でも同じようなメッセージがありますね。

    https://msmania.wordpress.com/tag/ihtmldocument/

    インターフェイス名で検索してみましたが、IEventTarget に関する資料は見つかったものの、IEventTarget2 に関しては見つかりませんでした。

    一応、OleView.exe からは下記のような情報が拾えましたが…関連性は不明です。

    [
      odl,
      uuid(30510839-98B5-11CF-BB82-00AA00BDCE0B)
    ]
    interface IEventTarget2 : IUnknown {
        HRESULT _stdcall GetRegisteredEventTypes([out, retval] tagSAFEARRAY** ppEventTypeArray);
        HRESULT _stdcall GetListenersForType(
                        [in] LPWSTR pszEventType, 
                        [out, retval] tagSAFEARRAY** ppEventHandlerArray);
        HRESULT _stdcall RegisterForDOMEventListeners([in] IDOMEventRegistrationCallback* pCallback);
        HRESULT _stdcall UnregisterForDOMEventListeners([in] IDOMEventRegistrationCallback* pCallback);
    };
    
    
    typedef struct tagtagSAFEARRAY {
        unsigned short cDims;
        unsigned short fFeatures;
        unsigned long cbElements;
        unsigned long cLocks;
        void* pvData;
        tagSAFEARRAYBOUND* rgsabound;
    } tagSAFEARRAY;
    
    typedef struct tag__MIDL___MIDL_itf_mshtml_0001_0042_0010 {
        unsigned int cbSize;
        unsigned int fType;
        unsigned int fState;
        unsigned int wID;
        wireHBITMAP hbmpChecked;
        wireHBITMAP hbmpUnchecked;
        unsigned long dwItemData;
        unsigned char szString[80];
        wireHBITMAP hbmpItem;
    } __MIDL___MIDL_itf_mshtml_0001_0042_0010;
    

    一応、GAC の方も更新されているようでした。

    "C:\WINDOWS\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll"
    ファイルバージョン 7.0.3300.0
    更新日時 2017/05/24 08:26:23

    2017年6月11日 2:27
  • Hoshinaです
    こんにちは

    魔界の仮面弁士さん、投稿ありがとうございます。

    ご指摘にありましたように、
    ・きわめて単純な WPF + MSHTML を使用したプログラムで確認してみます
    ・ファイルのタイムスタンプ等も確認してみます

    解決の切り口になってくれればうれしいですね。
    結論は、追って投稿します。

    本日好天のため、畑の作業小屋のトタン屋根の吹き替え作業中です。
    ただいまお昼休みで、気になったのでフォーラムを覗いてみました。すぐの確認はできませんので、ご了解ください。

    それでは

    2017年6月11日 3:15
  • Hoshinaです

    魔界の仮面弁士さんに教えていただいた項目をしらべてみました。
    DLL の更新日付は、2017/06/05 となっていました。

    Windows フォルダーに存在する mshtml.dll のファイルバージョン
     11.0.15063.332

    Windows.old フォルダーに存在する mshtml.dll のファイルバージョン
     11.0.14393.1066

    GAC のファイルバージョン
     7.0.3300.1

    ごくわずかですが、魔界の仮面弁士さんと違いがあります。

    また、Visual Studio の参照の追加で、該当する DLL を選択した場合に表示される情報エリアの表示は以下の通りです。
     ファイバージョン:11.0.15063.0
    正しい DLL を参照しているように見えます。

    プログラムの内容に関して簡単に書きますと、
    ・WebBrowser クラスを使用しているが、google map api などで完結している場合は、コンパイル・実行とも問題なし
    ・WebBrowser クラスを使用し、mshtml.dll を使用するものは、コンパイルエラー
     具体的には、mshtml.IHTMLDocument3 で hidden 項目内容を読みだしている
     mshtml.HTMLDocumentEvents2_Event で、マウスクリックイベントの設定をしている

    このようになります。
    それから、HTML など Google map 以外のリソースは、すべてローカルファイル(File:///でアクセス)しています。
    情報をお持ちの方の投稿をお願いします。

    それでは


    • 編集済み Hoshina 2017年6月13日 7:42 ハンドル名に敬称をつけていなかった
    2017年6月11日 7:42
  • ちょっとした思いつきですが、ソリューションエクスプローラの参照>MSHTMLのプロパティ「相互運用型の埋め込み」がもしtrueであれば、falseにしてみるとか。
    2017年6月11日 8:38
  • Hoshinaです

    MSHTMLのプロパティ「相互運用型の埋め込み」は true となっていました。
    false に変更しても、変化ありませんでした。

    世界中で私だけが地獄に落ちているという、不吉な予感がしてきました。
    どなたか、地獄の隣人の方はいらっしゃいませんか?

    2017年6月11日 9:00
  • Hoshina さま よろしく。

    Windows 10 とありますが、 Insider Preview でしょうか?。
    と言うのは、通常版では 6 月上旬に Update の誤配布があり、Install 失敗に終わっていて、
    5 月下旬のままです。 (v1703 build 15063.332)

    気になるのは、Insider Preview だったとして、細部まで、整合が取れない形になっているケースです。
    その場合、次期以降の修正で健全化の可能性がある気がします。
    15063.2.rs2_release_svc_d.170531-1743 (UUP-CTv2) (2017/06/02 辺り配布 x86 のみ?) がパッチの名称です。
    5 月末以降の Update をお調べになって、該当ファイル dll が対象に含まれていたか否か裏取りするのをお勧めします。

    • 編集済み ShiroYuki_Mot 2017年6月11日 12:08 v1703 ミスタイプを訂正
    2017年6月11日 11:17
  • 本筋ではありませんが…。

    通常版では 6 月上旬に Update の誤配布があり、Install 失敗に終わっていて、

    6/1 の誤配信があったのは、Insider Preview の話だった(一例)と記憶していますが、何かほかにありましたっけ?
    なお、定例のアップデート配信日は日本時間だと第二火曜日の翌日なので、次は 6/14 です。
    (手元の常時稼働の Windows 10 1703 環境でも最終の更新は 5/10)

    -----

    これだけでは難なので、1703 の手元環境で WPF アプリ に WebBrowser を貼り付け、MSHTML を参照設定して適当に変数を作ったプロジェクトでは特に問題が起きませんでした。
    環境固有の問題の可能性は高いかもしれません。
    (仮にそうだとして、どうやって直せるの?…については答えを持っていません…)

    2017年6月11日 11:45
  • Azulean さま 拝見しました。

    はい。  本筋からは外れますが、  X86 限定?で、 06/02 前後に配布されました。

    https://answers.microsoft.com/ja-jp/windows/forum/windows_10-update/150632rs2releasesvcd170531-1743-uup-ctv2/c61f40a2-01e8-4987-aded-5f3b2d8067d3

    尚、5 月は、 定例 KB4016871 > 15063.297、 下旬 KB4020102 > 15063.332 ですね。

    https://support.microsoft.com/ja-jp/help/4020102

    混乱していた時期の様ですので、他にトラブルが潜在する可能性は考えられますね。

    2017年6月11日 12:03
  • Hoshinaです

    原因が分かりました。

    mshtml.IHTMLDocument3 doc   エラー

    MSHTML.IHTMLDocument3 doc   正常(すべて大文字)

    今まで、2週間ほど、上記のままでコンパイルできていましたので、まったく思い及びませんでした。
    コンパイル後、正しくプログラムが動作しています。

    • 回答としてマーク Hoshina 2017年6月13日 7:48
    2017年6月13日 7:47
  • Hoshinaです
    こんにちは

    今日になり変化がありました。

    前回までの結果では、使用する名前空間を mshtml から MSHTML に変更することで、コンパイルすることができるようになったというものです。

    但し、これでは次の問題があります。
    ・使用している DLL によって、ソースファイルに「using mshtml;」「using MSHTML;」の違いがでる

    このために、ソースファイルを統一することができません。
    色々とためそうと思い、Visual Studio を起動しました。

    すると、コンパイル時の警告に
    「このコンピュータには使用できる複数の変換ラッパーが組み込まれており、より機能が豊富かもしれない。
     別のものに切り替えてみますか?」
    このような(正確な文言は記録していませんでした)項目があり、切り替えてみるを選択したところ、

    using mshtml;

    に統一することができました。
    前回までは、このような項目がなかったと思いますが、確かとは断言できません。
    この仕組み自体はわかっていませんが、これで本当にやりたいことが実現できたと思います。

    それでは

    • 回答としてマーク Hoshina 2017年6月16日 22:56
    2017年6月16日 22:56