C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: InternetExplorer.Application


(過去ログ 137 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■80865 / inTopicNo.1)  InternetExplorer.Application
  
□投稿者/ furu (64回)-(2016/08/15(Mon) 22:57:30)

分類:[.NET 全般] 

C# 2012 .NET Framework4 IE11

InternetExplorer.Applicationを使っているのですが
新しいPCで返ってくるComObjectのタイプが本来のクラスでなく
困っています。

{
  //ReleaseComObjectなど省略

  Type classType = Type.GetTypeFromProgID("InternetExplorer.Application");
  var application = Activator.CreateInstance(classType);
  
  application.GetType().InvokeMember(
                      "Visible",
                      System.Reflection.BindingFlags.SetProperty,
                      null,
                      application,
                      new object[]{true});
  application.GetType().InvokeMember(
                      "Navigate",
                      System.Reflection.BindingFlags.InvokeMethod,
                      null,
                      application,
                      new object[]{"http://www.yahoo.co.jp/"});

  System.Threading.Thread.Sleep(5000);  //本当はDocumentCompleteイベントを待つ

  var doc = application.GetType().InvokeMember(
                      "Document",
                      System.Reflection.BindingFlags.GetProperty,
                      null,
                      application,
                      new object[]{});

  var all = doc.GetType().InvokeMember(
                      "all",
                      System.Reflection.BindingFlags.GetProperty,
                      null,
                      doc,
                      new object[]{});

  var item = all.GetType().InvokeMember(
                      "item",
                      System.Reflection.BindingFlags.InvokeMethod,
                      null,
                      all,
                      new object[]{1});

  MessageBox.Show(item.GetType().ToString());
}

GetTypeの戻り値が、今までは
  mshtml.HTMLHeadElementClass
  mshtml.HTMLAnchorElementClass
  mshtml.HTMLBodyClass
などでしたが
新しいPCでは、すべて
  System.__ComObject
です。

新しいPCで、特に違うのはOSが64bitなのですが
これが原因かどうかわかりません。

よろしくお願いします。
  

引用返信 編集キー/
■80866 / inTopicNo.2)  Re[1]: InternetExplorer.Application
□投稿者/ 魔界の仮面弁士 (820回)-(2016/08/16(Tue) 07:11:37)
No80865 (furu さん) に返信
> application.GetType().InvokeMember(
> "Visible",
> System.Reflection.BindingFlags.SetProperty,
> null,
> application,
> new object[]{true});

2012 ですよね。dynamic 型を使わないのですか?


> GetTypeの戻り値が、今までは
>   mshtml.HTMLHeadElementClass
>   mshtml.HTMLAnchorElementClass
>   mshtml.HTMLBodyClass
> などでしたが
型名が重要な場合は、mshtml を参照設定して使った方が良いですよ。


> 新しいPCでは、すべて
>   System.__ComObject
> です。
もしかして、.GetType().GUID が Guid.Empty だったりしますか?


手元の環境(2015 + .NET 4.6.1)だと、mshtml.HTMLHeadElementClass を返してきましたが、
ターゲットフレームワークを 3.5 に下げたら、なぜか当方でも
System.__ComObject を返すようになりましたが、その後は、
4.6.1 に戻しても、System.__ComObject を返す状態になりました。
要因が掴めませんが、他の環境でも試してみます。

(IProvideClassInfo.GetClassInfo あるいは IDispatch.GetTypeInfo 経由で
 ITypeInfo.GetDocumentation を呼び出せたりしないかな…)
引用返信 編集キー/
■80870 / inTopicNo.3)  Re[2]: InternetExplorer.Application
□投稿者/ 魔界の仮面弁士 (821回)-(2016/08/16(Tue) 10:47:53)
No80866 (魔界の仮面弁士) に追記
> 要因が掴めませんが、他の環境でも試してみます。
複数の Visual Studio が入っている環境で試してみました。

VS2008 & .NET 3.5 => System.__ComObject
VS2010 & .NET 3.5 => mshtml.HTMLHeadElementClass
VS2015 & .NET 4.6.1 => mshtml.HTMLHeadElementClass

作成したプロジェクトのプラットフォームを確認すると、
2008:Any CPU ビルド
2010:x86 ビルド
2015:Any CPU (32 ビットを優先)ビルド
となっていました。


それでは、と VS2008 も x86 ビルドにしてみたところ、
こちらも mshtml.HTMLHeadElementClass に変わりました。
x64 ビルドだと System.__ComObject です。

2010/2015 も同様で、32bit だと mshtml の物が得られますが、
64bit 実行だと System.__ComObject になってしまいますので、
このあたりに原因があるようです。



> ターゲットフレームワークを 3.5 に下げたら、なぜか当方でも
> System.__ComObject を返すようになりましたが、その後は、
> 4.6.1 に戻しても、System.__ComObject を返す状態になりました。

VS2015 + 4.6.1 の時には、「Any CPU (32 ビットを優先)」が選択されていたため、
実質、32bit 動作であったため、mshtml.HTMLHeadElementClass が得られたようです。
(このオプションは、VS2012 + .NET4.5 以降で追加されています。)

VS2015 + 3.5 の場合、"32 ビットを優先"(anycpu32bitpreferred) が使えないため、
このオプションが外れてしまい、後で対象フレームワークを 4.6.1 に戻した後は
64bit 動作に変更されてしまい、System.__ComObject しか返されなくなったようです。


特に 2015 においては、同じ Any CPU ビルドでも、
「32 ビットを優先」のチェックを外すことで、
System.__ComObject が返されるようになりました。



>> 新しいPCで、特に違うのはOSが64bitなのですが
>> これが原因かどうかわかりません。

ということで、プラットフォーム ターゲットを確認してみてください。
引用返信 編集キー/
■80879 / inTopicNo.4)  Re[2]: InternetExplorer.Application
□投稿者/ furu (65回)-(2016/08/16(Tue) 12:57:04)
No80866 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士さん、いつもありがとうございます。
勉強になります。

> 2012 ですよね。dynamic 型を使わないのですか?

dynamicがない時に作成したプログラムでそのままでした。
dynamicで書くと、すごいシンプルですね。

    {
      Type classType = Type.GetTypeFromProgID("InternetExplorer.Application");
      dynamic application = Activator.CreateInstance(classType);

      application.Visible = true;
      application.Navigate("http://www.yahoo.co.jp/");

      System.Threading.Thread.Sleep(5000);
      
      dynamic doc = application.Document;
      dynamic all = doc.all;
      dynamic item = all[1];

      MessageBox.Show(item.GetType().ToString());
      
      System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(all);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);

      application.Quit();

      System.Runtime.InteropServices.Marshal.ReleaseComObject(application);
    }

> 型名が重要な場合は、mshtml を参照設定して使った方が良いですよ。

当時、なぜか挫折しました。
インストールしてないPCとかあったのかな。

    {
      var IE = new SHDocVw.InternetExplorer();
      IE.Visible = true;
      IE.Navigate("http://www.yahoo.co.jp/");

      System.Threading.Thread.Sleep(5000);

      var doc = IE.Document as mshtml.IHTMLDocument2;
      var all = doc.all as mshtml.IHTMLElementCollection;
      var item = all.item(Type.Missing, 1) as mshtml.HTMLHeadElement;

      //MessageBox.Show(item.GetType().ToString());
      
      System.Runtime.InteropServices.Marshal.ReleaseComObject(item);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(all);
      System.Runtime.InteropServices.Marshal.ReleaseComObject(doc);

      IE.Quit();

      System.Runtime.InteropServices.Marshal.ReleaseComObject(IE);
    }

> もしかして、.GetType().GUID が Guid.Empty だったりしますか?

Guid.Emptyですね。

引用返信 編集キー/
■80880 / inTopicNo.5)  Re[3]: InternetExplorer.Application
□投稿者/ furu (66回)-(2016/08/16(Tue) 13:11:43)
No80870 (魔界の仮面弁士 さん) に返信
> ということで、プラットフォーム ターゲットを確認してみてください。

プラットフォーム
 Any CPU
対象のフレームワーク
 .NET Framework4

です。

他の64bit機でも同一現象でした。

mshtmlを参照設定し、

if (obj is mshtml.HTMLHeadElement)

で判定するようにします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -