2009-09-30 25 views
5

私はWindowsフォームC#プロジェクトでWebBrowserコントロールを使用していますが、同時に実行できるアプリケーションのインスタンスの数に制限があるかどうかを知りたいと思っていました。 (言い換えればMSFTは、物理マシンの制限以外の制限を強制しない - CPU /メモリなど)Webブラウザコントロールの制限

+0

WebBrowserコントロールの制限についての回答(長いもの)を投稿しましたが、WebBrowserコントロールのレンダリングエンジンが現在インストールされているIEバージョンのエンジンを使用しているというアイデアを修正したいと思いますどのバージョンをインストールしたかによってどのバージョンのレンダリングが使用されるかを予測して確認する方法の概要を説明しました。 (私の答えを参照してください)しかし、基本的に、それはIE 4.0またはIE 7.0をデフォルトでレンダリングするために使用しました。これはレジストリを介して変更可能です。乾杯。 –

答えて

3

WebBrowserコントロールには人為的な制限はありません。

しかし、IEのレンダリングエンジン(エンドユーザーのコンピュータにインストールされているバージョン)を使用するため、かなりのメモリが使用されます。

あなたは何をしようとしていますか?

ウェブブラウザを作成する場合は、WebKitGeckoなどのより優れたレンダリングエンジンを使用することをおすすめします。

+2

このような選択には、トレードオフのセットが含まれます。WebKitまたはGeckoインストールが大きくなり、これらのコンポーネントにセキュリティバグが見つかるたびにパッチを発行する必要があります。一方、IEアップデートがインストールされている場合は、IEコンポーネントが更新されます。 – EricLaw

+0

しかし、彼はIE6のユーザベースを増やしています。http://mashable.com/2009/07/16/ie6-must-die/ – SLaks

+0

私は他のレンダリングエンジンをよく知っています。 IE。 私はまた、メモリ使用の問題を予期していましたが、私が10以上のテストをしたとき、私は何らかの壁に衝突しました...そしてそれはメモリではなく、CPU関連のようでした。マシンに8つのコアがあると考えても意味がありませんでした。 – webly

0

このコードを試してみて、何が起こるかを参照してください。

int count = 0; 
List<Form> forms = new List<Form>(); 
try 
{ 
    while (true) 
    { 
     Form f = new Form(); 
     WebBrowser wb = new WebBrowser(); 
     f.Controls.Add(wb); 
     f.Show(); 
     wb.Url = new Uri(@"http://www.stackoverflow.com"); 
     forms.Add(f); 
     count++; 
    } 
} 
catch 
{ 
    MessageBox.Show(count.ToString()); 
} 

私はそれが何百ものだと思うするつもりですが、私は知らないよ。

+2

'while'ループの外側でtry/catchを動かすと、ループを止めることはありません。 – SLaks

+1

@SLaks:done。あなたは私を恥じた。 :)実際には、MessageBoxがポップアップしたら、私はVisual Studioで 'stop'ボタンを押しただけです。 – MusiGenesis

+1

@MusiGenesisメッセージボックスがポップアップしたときに停止を押すことができないことは嫌いです。それは、devenvプロセスを何度かシャットダウンするように強制しています:( –

38

[ここで言及した問題のほとんどが答えたかのStackOverflowでの私の以前の回答セクションである程度対処されているあなたが興味があるならば、私を閲覧すること自由に感じ、私は...あなたに

をいくつかの欠点を教えてみましょうWebBrowser-Control関連の回答]を参照してください。ページが本当にロードが確実に行うことは非常に困難である行われているとき、実際には、あなたがこれを行うことができるようにするために、ハックのシリーズを採用する必要が検出

  1. は、いくつかの方法やアイデアにも話をされていませんオンラインでは知られていませんが、私はこのコントロールで戦ってきた年をいくつか考え出し、コードベースを開発して動作させるようにしました!そして、あなたがこれについて助けが必要な場合、私はより詳細を提供することができます。

  2. これをまっすぐに教えてください。 のデフォルトのレンダリングエンジンは、すべての プラットフォームでの互換性を保証するために修正されています。

    基本的に、ブラウザがIE 7 - IE 9の場合、 レンダリングエンジンはIE 7.0のみ(デフォルト)です。

    インストールされているIEバージョンがIE 6以下の場合は、 以外の方法で設定しない限り、 レンダリングエンジンはIE 4.0(冗談ではありません)です。

    WebBrowserコントロールが 現在インストールされている(現在のIEのバージョン)であるが、これは、真実ではありません ので、彼らは、これは下位互換性の問題を軽減するために行うものは何でも使って誤解があります。あなたは通常のブラウザで www.whatsmyuseragent.comにアクセスしてから (証明として)を見ることができますし、 WebブラウザのWebサイトに再度アクセスしてください。 はMSIE 7.0 :)。

    あなたはどちらかのMETAタグ内のページを使用して、またはWebBrowserコントロールを実行するマシン上でレジストリ を編集し、インターネット エクスプローラの現在インストールされたバージョンを使用するように設定することができます( CURRENT_USERとLOCAL_MACHINEのためになるの編集両方とも働く)。

    互換性のため、デフォルトでIE7標準モードでページをレンダリングします。これを回避するには、この問題を解決するためのMETAタグメソッドとレジストリ編集メソッドの両方について議論する下記のリンクに従ってください(32 & 64ビットシステムの場合)。解決策は、誤ってまたは予期せず機能している機能に関する他の人の質問に対する回答として含まれています。回答を正しく解釈/理解するために質問を読むことは必要ではありません。リンクは以下のとおりです:

    Script runs slower in the dotnet WebBrowser control(Ctrl +クリックして新しいタブで開きます)

  3. イベントシステムはかなりハッキリですが、実際に正しく文書化されていないものと、全く文書化されていないものを知る必要があります。実際には、私はMSの最悪の製品の1つであると宣言しました。これは、製品の設計面で、また、入手可能にしたうえでのドキュメントの不足という点でもあります。乾燥したMSDNスタイルのドキュメントは面白いです。

  4. 不正フレームは、document.frames.lengthを呼び出すと、すべてのフレームではなくトップレベルのドキュメントのすぐ下にフレームを取得します。すべてのネストを取得するために独自の関数を記述する必要がありますフレーム(無限に入れ子になっている)と私はあなたがそれを助けが必要な場合は、これを行った。フレームの検出と参照は非常に重要であり、ページが実際に読み込みを完了したことを検出する際に重要な役割を果たします。そのため、WebBrowserコントロールで.Busyと.ReadyStateを使用するだけでは不十分です。実際、それは十分に近いところにはありません。

  5. 「このページを残してよろしいですか?」というメッセージを表示する新しいIE9ダイアログボックスを含め、すべてのページからポップアウトするJavaScriptダイアログボックスを削除するための組み込みシステムはありません。私はこれを行うルーチンを開発し、それらを取り除く、基本的に、メソッドの1つは、WebブラウザコントロールからHTMLページに送信されたJavaScriptを実行し、アラートを取り除き、確認し、ダイアログボックスを印刷するように指示します私が以前に言及した新しいIE 9ダイアログボックスを取り除く)。これらはJS単独からの潜在的なダイアログボックスであり、私は基本的にJavaScriptに.alert関数がNullであることを知らせるJavaScriptを実行します(空のメソッド/関数であり何もしません)。 JavaScriptから来る4つのダイアログボックス。もちろん、あなたが4箱以上を数えているなら(あなたがそれ以上の数を数えたならば、私に知らせてください)。また、これを行うことができる2番目の方法があり、JavaScritpダイアログボックスを防ぐだけでなく、Webブラウザコントロールに表示される/表示される可能性があるすべてのダイアログボックスで、このメソッドはWinHooksを使用し、それが表示されると、ダイアログボックス(テキストとしての内容、テキスト/タイトルなどのキャプション)から必要なだけ多くの情報を取得し、表示を希望するかどうかを決定したり、表示をキャンセルしたり、ダイアログボックス(つまりボタンのいずれか)をクリックすると、スタックは質問または情報のダイアログに適切に応答したと考えます。これは面白い方法ですが、まだ試していませんが、私は自由時間があるとWinHookプロセスを理解することを本当に楽しみにしています。いつものように、あなたが助けを必要とするならば、私が以前に答えたいくつかのウェブブラウザーコントロール質問を見てみてください。私は多くの人に答えてくれました。これは、ページが完全に読み込まれた時点を知ることに非常に依存します。これは非常に難しいですが(文書化されていないメソッドを使用しても100%信頼できる方法で可能です)。だからポイント1)。何度も関連性が高まります。

  6. 永続化または保存されるキャッシング情報を制御する方法はありません。キャッシング情報をフィルタリング、削除、または試行するために、独自のルーチンを開発する必要があります。履歴情報、Cookie、およびローカルシステムに格納されている実際のキャッシュファイルを含む、すべてのキャッシュタイプに対してキャッシュを防止します。あなたが自分自身でそれを行う2つの方法であなたにリードを与えるDeleteUrlCacheEntryを調べるならば、私はStackOverflowでこれを行う方法についていくつかの以前の回答があると確信しています。DeleteUrlCacheEntryを使用すると、「Cookie:」タグ、「Visited:」タグ、および「http://」および「https://」で始まる単純なWebサイトアドレスである項目で始まるキャッシュ項目を再生できます。 (また、httpsはキャッシュされています; |少なくともロケーション情報はとにかくです)また、DeleteUrlCacheEntry(およびキャッシュ全体をループするために使用されるFindFirstUrlCacheEntry/FindNextUrlCacheEntry)で利用できるこの情報には、実際のインターネットInternet Explorerのメニューバーで*記号をクリックして[お気に入り]セクションの[履歴]セクションに移動したときに表示される、実際の履歴リストとは別の場所です。なぜ彼らはこのように何をしているのか、正式な違いは何か(なぜ違いがあるのか​​)についてはわかりませんが、それを知ることのリストに載っています。 「訪問済み:」リストは、あなたが訪れたサイトのリストですあなたが訪問したウェブサイトのリストである。手動で入力して入力したサイトと、HTMLページやブラウザで自動的に収集されるビットと部分(iframeや自動リダイレクト、ポップアップなど)の区別はしていないと思います...私はそれが何であるかを理解することが難しいと思っています。私が見つけたら、このビットを更新します。

  7. デフォルトのユーザエージェントをオーバーライドするのは適切ではありません。独自のユーザエージェントをnavigateメソッドに渡すことはできますが、ユーザがそこをナビゲートすると、設定したとおりにユーザエージェントの詳細が表示されますしかし、これは永続的ではありません。したがって、ユーザーがナビゲートされたページ上のリンクをたどった後、WebBrowserコントロールは、WBコントロールがサイトのレンダリングに使用している実際の(実際の)ユーザーエージェントを送信し続けます。ただし、ナビゲーションを傍受し、キャンセルし、 .navigateメソッドをもう一度やり直してください。これはBeforeNavigateイベントを受け取らないので、画像やLINKタグファイルなどのことを考慮することができないので、それらを傍受して、それらのために送られたヘッダを変更することはできません。代わりに、いくつかの外部関数urlmon.dllをインポートして外部のソリューションを使用する必要があります。これは100%実行でき、完璧に動作しますが、別の依存関係が追加されています(ただし、urlmon.dllは現在までのすべてのWindowsバージョンに含まれています)。

  8. 「この特定のフレームにすべてのWBコントロールアクティビティをリダイレクトする」というプロパティまたはメソッドはありませんが、欲しいまたは必要な場合にのみ、唯一のフレームサポートがTargetFrameName引数です。 .navigateメソッドが付属しています。ユーザーは任意のフレームから何かをクリックすることができるので、そこに起こっている必要がある各アクションについて、参照を取得して手動で行う必要がありますあなたがそれをチェックしない限り、

  9. フレームが外部ドメインを指しているサイトのクロスフレームセキュリティ:abc.comにページがあり、iframeにxzy.comという名前のドメインのソースがある場合はほとんどの広告主は独自のサーバーからコンテンツを中継するときに行います)、そのフレームにアクセスしようとすると、アプリが実行されている昇格された特権に関係なく、クロスフレームドメインセキュリティの問題に遭遇します。愚かなことですが、フレームワークを参照するリファレンスドキュメントにはデータが含まれていないため、そのデータを使用できなくなり、WBコントロールが理由を教えてくれません。あなたがアクセスできるのは、フレームのソースURLだけです。それはその中には何もありません。溶液?あなたのマシンにTypeLibが登録可能で、これをオーバーライドすることができます.WBコントロールに組み込まれていなくても、独自のプログラミングインターフェイスに組み込まれているわけでもありません。実際には参照することによって使用する必要がある外部のCルーチンです。 TypeLibを登録します(今の.NETではこのメソッドを使用しないで新しい方法があるかどうかはわかりません)。しかし、このTypeLibの周りにコードを書く必要があります。現在のプログラミング環境でも同様です(余分なコードはTypeLib登録のものを使用するため、関数を呼び出すだけではなく、使用しています)。

  10. JavaScriptをオン/オフにすると、ナビゲーション設定などのナビゲーション設定をオン/オフにします。Web抽出プログラムを作成している場合、ナビゲーションサウンドはユーザーを狂わせてしまうでしょう。これらのオプションをオンまたはオフにすることはWebBrowserコントロールに組み込まれていないため、必要に応じてレジストリを使用してグローバルに変更してから変更することができます一度やり直してください。これらのインターネット設定関連の設定/オプションのそれぞれについて、reg値を調べる必要があります。あなたのアプリケーションインスタンスでこれを行う方法はありますが、InternetSecuritySettingsからルーチンをインポートすることはできますが、もう一度WBに組み込まれていないし、リストに追加する一連のハッキングもあります。

  11. もちろん、インターネット接続が存在するかどうか、およびインターネット接続が存在するかどうかを検出する必要があります。 WBコントロールは、それを動作させることの重要な部分であるにもかかわらず、これを行う上であなたに一見光り輝くことさえありません。だから、あなたが接続を作るためにあなたのWBコントロールトライアルがいつも現れるように、ダイヤルアップ接続(ダイヤルアップを使用している人向け)のポップアップウィンドウや他の接続のインターネットウィザードを望まないなら、どこかをナビゲートしようとしますコントロールを使用して手動で接続を試してみる必要があります。このコントロールは、MS外部のコントロールでなければならず、MS APIがそのコアにないコントロールでなければなりません(MSインターネットAPIはAPIインターネット接続のためにこれらのポップアップボックスを起動する)。 Winsockを使用していない外部のwinsockタイプのコントロールを基礎から書き出し、使用方法を学び、WBでアクションを実行するたびにインターネットが接続されているかどうかを確認するために使用する必要がありますコントロール。

  12. 「自動化エラー」または「不特定のエラー」というメッセージが表示されます。実際のHTMLドキュメント/ページの要素を処理するときに何がうまくいかなかったかは分かりませんブラウザが対処して読むことができる方法であり、定期的に対処しているにもかかわらず、推奨されない方法で行われるhtmlがあるとき。たとえば、target = _topのアンカーリンクがあり、_topパーツの周りに引用符がない場合、ブラウザがこれを理解していて、期待どおりに動作しても、Webブラウザーコントロールは手を空中に投げ込み、 「特定されていないエラー」 - それが超嫌なことをあなたに伝えさえしない。したがって、WBコントロールが動作するように、要素が次のように記述されていることを確認する必要があります:すべてのライブ文書に対してこれらの変更を行うのは退屈な作業です。必要に応じてすべてのページでこれを行う一般的なルーチンを書いてください。ドキュメントの後に実行されるルーチンは完全にロードされています(これを行うには確実に検出する必要があります)。私がWBコントロールで適切に行うのが最も難しい場合は、ページが完全に確実にロードされたことを検出する必要があります。それに加えて、WBコントロールでは、これを正確に検出することによって、すべてが必要になるため、これが最も重要なことです。

  13. ナビゲーション中に「履歴なし」を選択するか、履歴なしのナビゲーション作業を行う方法を見つけると、これらのページを前後に移動することができないため、別の履歴オブジェクトが必要です(つまり:これらのページとアドレスに.GoBackまたは.GoForwardを呼び出す)。履歴から削除したり、履歴や特定のナビゲーションを保存しないように指定した場合、そのページに移動しない限り元に戻ることはできません。ページがグローバルヒストリーから削除されたとしても(ヒストリーブラウズを行わない唯一の方法であるにしても)、元のページに戻ることができたはずのメモリ内のヒストリリストを保持していたはずです。あなたが戻ってみると、(すべての上に)実行時エラーが発生し、最近の.NET時代には、.CanGoBackというメソッドを提供していました。 (pre.NETを使用している場合)あなたはこれを中心にコードを書くか、またはあなたがどこにいたのかを数えておく必要があります(これは簡単ではありませんが、まだ実行可能です)。

私が続けることができます(私は思う)が、私は今のところそのままにしておくだろう、しかし、離れてそれらのものから、それはかなりクールなコントロールであり、全体の新しい世界への扉を開けませんアプリやアイデアを実現することができます。これらの点のいくつかに留意しておきましたが、これは私が解決したすべての問題です(そして解決策が必要なときに解決した問題がまだまだあります)。質問や助けが必要な場合は、私は少なくとも私があなたを助けようとすることを喜んで知っている。

私はこのことを理解しようとしていたとき、誰もこのコントロールについて本当に知りませんでしたので、助けてくれる人はいなかったので、少しずつ少しずつ考えなければなりませんでした。それ以来、それは人気を得ており、それを使用している人が増えています(特に.NETバージョンでは段階的な改善が行われています)。だから、私が怖い孤独な場所だったことを覚えているように、前にあった状況にいる人を助けるのはうれしいでしょう。そして、MSはドキュメンテーションを賢明にしませんでした。これは、社内での使用のために開発したもので、他の人には使用させ、入力/出力の引数/パラメータのリストのみを提供します。&すべてのプロパティ、メソッド、イベントの戻り値のリスト。または実際のコード例は、確かに、それに付属する問題の配列を解決するという点で賢明な文書はありません。

[OK]を今のところそれは、このコントロールとその使用の人々の意見に興味がありますので、お気軽にコメントを残してください。世話をする。エルクス。

+2

あなたの素晴らしい答えをありがとう。私はページの読み込みが完了したことを検出するのにも問題があります。詳細を教えてください。私は多くの方法を試しましたが、それでも正常に動作させることはできません。 –

+0

こんにちは、あなたが助けてくれると約束した修正に興味があります。情報を手伝ってください。 – Smith

+1

お元気ですか、問題は新しい質問を保証するので、あなたはあなたの質問のそれぞれについて新しい質問をしてから、私にそれを指摘する必要があります。 –

関連する問題