MS WebBrowser + встроенный HTML-ресурс + res: // Протокол

У меня есть встроенный HTML-ресурс (helloworld.htm) внутри моего проекта Visual Studio. (То есть я добавил в проект HTML-файл и установил его свойства на «Встроенный ресурс».

В том же приложении у меня есть элемент управления WebBrowser.

Я хотел бы указать элементу управления WebBrowser отображать ресурс HTML с помощью res: // протокол.

Но я не могу определить точный формат, необходимый для адресации встроенного ресурса с использованием этого стиля URL.

Любые идеи? Спасибо!


person user144051    schedule 10.08.2009    source источник
comment
Раньше у меня это работало, но я забыл формат URL-адреса с протоколом res: //.   -  person user144051    schedule 10.08.2009
comment
Есть обновления?   -  person DmitryBoyko    schedule 07.02.2013


Ответы (6)


Я знаю, что эта ветка мертва, но мне пришлось сделать это вчера, и я не смог заставить работать ни один из этих методов. Итак, я провел небольшое исследование и нашел метод ниже, используя класс Stream. Я подумал, что выложу его здесь, на случай, если кто-то еще наткнется на ту же чушь:

Stream docStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("NameSpace.HTMLPage.html");
WebBrowser.DocumentStream = docStream;

Это сработало для меня без каких-либо усилий, и это было так просто. Я надеюсь, что это принесет пользу кому-то другому!

person Chris Barlow    schedule 03.02.2011
comment
Почему-то VLC ActiveX не работает таким образом ... stackoverflow.com/questions/14749242/ - person DmitryBoyko; 07.02.2013

Протокол res: жив и по-прежнему является отличным способом встраивать веб-страницы в приложения Windows с помощью элемента управления WebBrowser. К сожалению, мне кажется, что в файлах exe и dll есть два типа ресурсов: ресурсы C и ресурсы .net. Возможно, можно встроить ресурсы C в DLL-библиотеку .net, но я еще не понял, как это сделать.

Чтобы ответить на ваш вопрос, протокол res задокументирован по адресу здесь, но на самом деле создание dll или exe - непростая задача. Протокол res достаточно прост. Основная суть в том, что вы указываете res: //, следуя за ним по пути к исполняемому файлу или dll (просто имя dll, если оно находится в текущем пути). Для ресурсов типа HTML укажите имя файла. Вот недавняя статья MSDN, в которой рассказывается о некоторых известных проблемах с протоколом res: http://support.microsoft.com/kb/220830.

Создание ресурсов dll или exe может быть немного сложным. Для получения наиболее простых результатов сделайте все свои ресурсы типа HTML (даже файлы .js, .png, .jpg). Вместо того, чтобы называть ваши ресурсы идентификатором ресурса #defined, современные файлы res позволяют вам называть файлы строкой. Это сделает вашу жизнь намного проще.

Совет для опытных: указать имена папок в имени ресурса сложно; Я еще не понял, что это наша. Я думаю, что вы можете имитировать папки, добавив косую черту в имя ресурса, но я думаю, что протокол res сбивает с толку косые черты, думая, что первая часть пути - это тип ресурса. Явное указание типа ресурса может облегчить это.

Расширенный совет 2: для пути в новых версиях IE может использоваться символ '\', но вы можете использовать '% 5C' вместо '\', если вам нужно указать абсолютное или относительное расположение dll или exe.

Дополнительный ресурс:
MSDN Social: веб-браузер и res: протокол
DelphiDabbler: как создавать и использовать файлы ресурсов HTML < / а>

person Tim Ludwinski    schedule 28.03.2013
comment
это лучший ответ, теперь я знаю ограничение протокола res, потому что я не могу программно установить тип mime для файлов .mht - person dns; 03.08.2015

Это маленький вспомогательный класс и как его называть:

Как позвонить:

StreamResourceInfo info = 
    ResourceHelper.GetResourceStreamInfo(@"Resources/GraphicUserGuide.html");
if (info != null)
{
    WebBrowser.NavigateToStream(info.Stream);
}

Класс помощника:

using System;
using System.Reflection;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Resources;

namespace HQ.Wpf.Util
{
    public class ResourceHelper
    {
        // ******************************************************************
        /// <summary>
        /// Load a resource WPF-BitmapImage (png, bmp, ...) from embedded resource defined as 'Resource' not as 'Embedded resource'.
        /// </summary>
        /// <param name="pathInApplication">Path without starting slash</param>
        /// <param name="assembly">Usually 'Assembly.GetExecutingAssembly()'. If not mentionned, I will use the calling assembly</param>
        /// <returns></returns>
        public static BitmapImage LoadBitmapFromResource(string pathInApplication, Assembly assembly = null)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return new BitmapImage(ResourceHelper.GetLocationUri(pathInApplication, assembly));
        }

        // ******************************************************************
        /// <summary>
        /// The resource should be defined as 'Resource' not as 'Embedded resource'.
        /// </summary>
        /// <param name="pathWithoutLeadingSlash">The path start with folder name (if any) then '/', then ...</param>
        /// <param name="assembly">If null, then use calling assembly to find the resource</param>
        /// <returns></returns>
        public static Uri GetLocationUri(string pathWithoutLeadingSlash, Assembly assembly = null)
        {
            if (pathWithoutLeadingSlash[0] == '/')
            {
                pathWithoutLeadingSlash = pathWithoutLeadingSlash.Substring(1);
            }

            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return new Uri(@"pack://application:,,,/" + assembly.GetName().Name + ";component/" + pathWithoutLeadingSlash, UriKind.Absolute);
        }

        // ******************************************************************
        /// <summary>
        /// The resource should be defined as 'Resource' not as 'Embedded resource'.
        /// Example:            
        ///     StreamResourceInfo info = ResourceHelper.GetResourceStreamInfo(@"Resources/GraphicUserGuide.html");
        ///     if (info != null)
        ///     {
        ///         WebBrowser.NavigateToStream(info.Stream);
        ///     }
        /// </summary>
        /// <param name="path">The path start with folder name (if any) then '/', then ...</param>
        /// <param name="assembly">If null, then use calling assembly to find the resource</param>
        /// <returns></returns>
        public static StreamResourceInfo GetResourceStreamInfo(string path, Assembly assembly = null)
        {
            if (assembly == null)
            {
                assembly = Assembly.GetCallingAssembly();
            }

            return Application.GetResourceStream(ResourceHelper.GetLocationUri(path, assembly));
        }

        // ******************************************************************

    }
}
person Eric Ouellet    schedule 23.01.2014

webBrowser1.DocumentText = ResourceinWebBrowser.Properties.Resources.HTML.ToString();

Где:

  • webBrowser1 - это WebBrowser элемент управления
  • ResourceinWebBrowser - это ваш exe / имя проекта.
  • HTML - это имя вашего встроенного html-ресурса.
person miniGweek    schedule 14.12.2009

Самый простой способ, возможно, не самый безопасный и разумный, - это иметь переменную настроек, которая составляет базовую веб-страницу, размещать свои собственные теги маркеров для ЗАМЕНИТЬ при потоковой передаче строк в пакетах. Таким образом, после завершения нединамических частей веб-страницы вам нужно только отобразить динамические части для REPLACE в строке. Затем установите DoumentText = stringWebStream. Обязательно установите AllowNavigation = True.

person Rafo Bro    schedule 18.03.2014

Я знаю, что об этом спрашивали давно, но вот как IE интерпретирует res: протокол:

res: // sFile [/ sType] / sID

sFile Путь и имя файла модуля, содержащего ресурс, с кодировкой в ​​процентах.

sType Необязательно. Строковый или числовой тип ресурса. Это может быть пользовательский ресурс или один из предопределенных типов ресурсов, распознаваемых тегом FindResource. Если указан числовой тип ресурса, номер идентификатора должен следовать за символом #. Если этот параметр не указан, тип ресурса по умолчанию - RT_HTML или RT_FILE.

sID Строка или числовой идентификатор ресурса. Если указан числовой идентификатор, за символом # должен следовать фактический номер идентификатора, а не сам идентификатор. См. Пример для получения дополнительной информации.

person c00000fd    schedule 23.03.2015