我正在使用WebBrowser控件编写C#应用程序,我希望我显示的所有内容都来自嵌入式资源 - 而不是静态本地文件,而不是远程文件。
将控件的初始文本设置为嵌入式HTML文件非常适用于受this post启发的代码:
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"/>
等图像不起作用。我发现了类似的问题here和here,但两者都没有要求完全我的意思,即在exe中引用 embedded 资源,而不是文件。
我尝试res://...
并使用了<base href='..."
,但似乎都没有用(虽然我可能没有做对)。
也许(遵循我自己对this question的建议),使用一个小的嵌入式C#网络服务器是唯一的方法......但我会想到有一些技巧可以实现这一目标吗?
谢谢!
答案 0 :(得分:1)
我可以看到三种方法来实现这一目标:
1:将您需要的文件写入临时区域中的平面文件,将WebBrowser
导航到html文件,并在页面加载后删除它们
2:正如你所说,一个嵌入式网络服务器 - 不幸HttpListener
- 但请注意,这使用HTTP.SYS,因此需要管理员权限(或者你需要pre-open the port)
3:像1一样,但使用命名管道服务器来避免编写文件
我不得不说,第一个更简单,需要零配置。
答案 1 :(得分: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());
}
}