я хочу создать элемент управления WebBrowser, предоставить ему отображаемый HTML-код, а затем сделать так, чтобы он отображался вне процесса в собственном окне Internet Explorer.
Можно ли это сделать?
- да, это должно быть вне процесса
- у меня уже есть техника, которая включает в себя запись временного файла. я хочу удалить это хакерское решение
У меня есть еще три вопроса о работе stackoverflow, и все они работают над крошечным сегментом работы над следующим кодом:
public static void SpawnIEWithSource(String szHtml)
{
IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();
object mv = System.Reflection.Missing.Value; //special "nothing" value
object url = (String)@"about:blank";
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;
doc.Write(szHtml);
doc.Close();
ie.Visible = true;
}
Примечание. Приведенный выше код отлично работает в нативных приложениях.
Я подумал, что перейду к делу и посмотрю, есть ли у кого-нибудь другие идеи, которые не связаны с единственным способом, которым я смог это понять.
Решение для взлома, использующее временный файл:
public static void SpawnIEWithSource(String szHtml)
{
IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();
object mv = System.Reflection.Missing.Value; //special "nothing" value
object url = (String)@"about:blank";
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
//Todo: Figure out the .NET equivalent of the following
//so that it doesn't have to write a temporary file
//IDispatch webDocument = ie.Document;
//webDocument.Write(szHtml);
//webDocument.Close();
String tempFilename = Path.GetTempFileName();
try
{
//Rename to .htm, or else ie won't show it as actual HTML
String htmlFile = Path.ChangeExtension(tempFilename, "htm");
File.Move(tempFilename, htmlFile); //.NET's version of File.Rename
tempFilename = htmlFile;
//Write string to file
StreamWriter writer = new StreamWriter(tempFilename);
writer.Write(szHtml);
writer.Close();
url = (String)tempFilename;
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
//If we're going to delete the file, then we have to wait for IE to use it
//else we delete it before it uses it
while (ie.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
{
System.Threading.Thread.Sleep(10);
}
}
finally
{
File.Delete(tempFilename);
}
//Make IE Visible
ie.Visible = true;
}