Как добавить локальный файл script в HTML-код элемента управления WebBrowser?

Это кажется действительно глупым. Я пробовал кучу разных способов, и он просто не работает. У меня есть приложение WinForms с элементом управления WebBrowser. Если я попытаюсь с сырым html файлом на моем рабочем столе с использованием той же строки src, то src, который я собрал, отлично работает. Но включение такого же элемента в элемент управления WebBrowser не будет работать.

Здесь мой код:

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 не получает script. Однако, если я изменю "mySource" на внешний ресурс (через http://), он отлично работает!

Help!

Ответ 1

Я поднялся на ваш пост, играя со своими работами:

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);
}

поэтому все методы helperscript.js могут быть вызваны с помощью

webBrowser1.Document.InvokeScript("methodname");

здесь как ссылка для script invoke: Как добавить Javascript в элемент управления WebBrowser?

привет

Ответ 2

Попробуйте добавить file:// к URL-адресу.

Ответ 3

Существует длинная история об обходных решениях этого "исправления безопасности" от MS. Новое поведение было реализовано начиная с IE7. Взгляните на тег "base" и Элементы управления IE.

Я сделал следующее:

                    //TODO: if not mono
                var executableFilename = Path.GetFileName(System.Reflection.Assembly.GetEntryAssembly().Location);
                var keys = new[] { executableFilename, [vsname]+".vshost.exe" }; //check!

                Action<string, object, string> 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");
                }

Ответ 4

Это из соображений безопасности. Для этого вам нужен веб-сервер, иначе вы можете получить доступ к любому файлу в системе, которая будет большой дырой в безопасности.

В режиме разработки вы можете установить, например, на хром:

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

И вы сможете запустить свой код.