6

WebBrowserコントロールを使用してC#アプリを作成していますが、表示するすべてのコンテンツを、静的ローカルファイルやリモートファイルではなく、埋め込みリソースから取得する必要があります。

コントロールの初期テキストを埋め込みHTMLファイルに設定すると、この投稿に触発されたこのコードでうまく機能します。

browser.DocumentText=loadResourceText("myapp.index.html");

private string loadResourceText(string name)
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    Stream stream = assembly.GetManifestResourceStream(name);
    StreamReader streamReader = new StreamReader(stream);
    String myText = streamReader.ReadToEnd();
    return myText;
}

それだけに、HTMLで参照されているファイル(JavaScript、画像<img src="whatever.png"/>など)は機能しません。私はここここで同様の質問を見つけましたが、どちらも私が何を意味するのかを正確に尋ねていません。つまり、ファイルではなく、exeに埋め込まれたリソースを参照しています。

私は試しres://...てみました<base href='..."が、どちらもうまくいかなかったようです(私はそれを正しく理解していないかもしれませんが)。

おそらく(この質問に関する私自身の提案に従って)、小さな埋め込みC#Webサーバーを使用することが唯一の方法です...しかし、これを実現するためのトリックがあると思いましたか?

ありがとう!

4

2 に答える 2

1

これを実現するには、次の 3 つの方法があります。

1: 一時領域のフラット ファイルに必要なファイルを書き込み、WebBrowserhtml ファイルに移動し、ページが読み込まれたらそれらを削除します。

2:あなたが言うように、組み込みのWebサーバー-おそらくHttpListener-これはHTTP.SYSを使用するため、管理者権限が必要であることに注意してください(またはポートを事前に開く必要があります)

3: 1 と同様ですが、名前付きパイプ サーバーを使用してファイルの書き込みを回避します

私が言わなければならないのは、最初のものははるかに単純であり、構成を必要としないということです.

于 2008-11-08T08:39:10.487 に答える
0
/// Hi try this may help u.
private string CheckImages(ExtendedWebBrowser browser)
{
      StringBuilder builderHTML = new StringBuilder(browser.Document.Body.Parent.OuterHtml);
      ProcessURLS(browser, builderHTML, "img", "src");                
      ProcessURLS(browser, builderHTML, "link", "href");
      // ext...

      return builderHTML.ToString();

}

private static void ProcessURLS(ExtendedWebBrowser browser, StringBuilder builderHTML, string strLink, string strHref)
{
     for (int k = 0; k < browser.Document.Body.Parent.GetElementsByTagName(strLink).Count; k++)
     {
          string strURL = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].GetAttribute(strHref);
          string strOuterHTML = browser.Document.Body.Parent.GetElementsByTagName(strLink)[k].OuterHtml;
          string[] strlist = strOuterHTML.Split(new string[] { " " }, StringSplitOptions.None);
          StringBuilder builder = new StringBuilder();
          for (int p = 0; p < strlist.Length; p++)
          {
              if (strlist[p].StartsWith(strHref))                        
                  builder.Append (strlist[p].Contains("http")? strlist[p] + " ":
                      (strURL.StartsWith("http") ?  strHref + "=" + strURL + " ":
                           strHref + "= " + "http://xyz.com" + strURL + " " ));                           
              else
                  builder.Append(strlist[p] + " ");
          }

          builderHTML.Replace(strOuterHTML, builder.ToString());
      }
}
于 2009-09-24T12:44:21.543 に答える