¿Cómo agrego un archivo de script local al HTML de un control WebBrowser?

Esto parece realmente tonto. Lo intenté de varias maneras y simplemente no funciona. Tengo una aplicación WinForms con un control WebBrowser. Si bash con un archivo html sin formato en mi escritorio usando la misma cadena src, el src que armé funciona bien. Pero conectar las mismas cosas en el control WebBrowser no funcionará.

Aquí está mi código:

HtmlElementCollection head = this.wbPreview.Document.GetElementsByTagName( "head" ); if (head != null) { HtmlElement elm = this.webBrowserControl.Document.CreateElement("script"); string mySource = Environment.CurrentDirectory + @"\MyScriptFile.js"; elm.SetAttribute("src", mySource); elm.SetAttribute("type", "text/javascript"); ((HtmlElement)head[0]).AppendChild(elm); } 

WebBrowser no obtiene el script. Sin embargo, si cambio “mySource” a un recurso externo (a través de http: //), ¡funciona bien!

¡Ayuda!

Subí a tu publicación, mientras jugaba con cosas que seguían me funcionaron:

 HtmlElementCollection head = webBrowser1.Document.GetElementsByTagName("head"); if (head != null) { HtmlElement elm = webBrowser1.Document.CreateElement("script"); elm.SetAttribute("type", "text/javascript"); elm.InnerText = System.IO.File.ReadAllText(Environment.CurrentDirectory + @"\helperscripts.js"); ((HtmlElement)head[0]).AppendChild(elm); } 

, por lo que todos los métodos de helperscript.js pueden invocarse usando

 webBrowser1.Document.InvokeScript("methodname"); 

, aquí como referencia para el script invocar: ¿Cómo inyectar Javascript en el control WebBrowser?

saludos

Intente agregar file:// a la URL.

Hay una larga historia sobre las soluciones provisionales de esa “solución de seguridad” de MS. Se implementó un nuevo comportamiento a partir de IE7. Eche un vistazo a la etiqueta “base” y a los controles de funciones IE .

Hice lo siguiente:

  //TODO: if not mono var executableFilename = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location); var keys = new[] { executableFilename, [vsname]+".vshost.exe" }; //check! Action SetRegistryKeyOrFail = (key, val, regStr) => { var reg = Registry.CurrentUser.CreateSubKey(regStr); if (reg == null) throw new Exception("Failed registry: " + regStr); reg.SetValue(key, val); }; foreach (var key in keys) { SetRegistryKeyOrFail(key, 1, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_IMG"); SetRegistryKeyOrFail(key, 0, @"SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BLOCK_LMZ_SCRIPT"); } 

Esto es por razones de seguridad. Necesita un servidor web para hacer eso, de lo contrario, puede acceder a cualquier archivo en un sistema que sería un gran agujero de seguridad.

En el modo de desarrollo, puede establecer, por ejemplo, en chrome:

 chrome.exe --allow-file-access-from-files 

Y podrás ejecutar tu código.