Компилировать проект веб-приложения ascx в dll

Можно ли скомпилировать проект web-приложения .ascx(пользовательский контроль) в dll?

Я хочу сделать следующее:

  • Использовать один и тот же элемент управления на нескольких веб-сайтах.
  • Вставить css и .js в качестве ресурсов в элемент управления
  • Уметь обновлять супер легко. Если пользователь контролирует обновления, я просто хочу обновить 1.dll

Я успешно выполнил эту статью, http://msdn.microsoft.com/en-us/library/aa479318.aspx.

Однако это использует проекты веб-сайтов, и я не могу вставлять js css в качестве ресурсов в проекты веб-сайтов.

Любые идеи? Я иду об этом неправильно, должен ли я изменить подход?

Ответ 1

Конверсия проста и может быть полностью автоматизирована. Это просто требует изменения нескольких настроек и базовых классов в DLL Project, в которые вы хотите встроить элементы управления ASCX.

1.... Для каждого UserControl установите для параметра ASCX Build Action (в разделе "Свойства" ) значение "Встроенный ресурс" и удалите связанный с ним файл конструктора.

2... Сохранить проект.

3... Щелкните правой кнопкой мыши проект и выберите "Выгрузить проект".

4... Щелкните правой кнопкой мыши еще раз и выберите вариант "Изменить *.csproj".

Измените разделы, которые выглядят так (где звездочка представляет ваше имя класса):

<Compile Include="*.ascx.cs">
    <DependentUpon>*.ascx</DependentUpon>
    <SubType>ASPXCodeBehind</SubType>
</Compile>

чтобы выглядеть так

<Compile Include="*.ascx.cs" />

Это приведет к тому, что файлы с кодовым кодом будут скомпилированы независимо от файлов ASCX.

5... Сохраните изменения и щелкните правой кнопкой мыши проект и выберите "Обновить проект".

6... Откройте все ваши файлы * *.ascx.cs и сделайте их наследуемыми из следующего пользовательского класса UserControl, а не класса System.Web.UI.UserControl(вы можете необходимо найти родительские классы для завершения этого шага).

public class UserControl : System.Web.UI.UserControl
{
    protected override void FrameworkInitialize()
    {
        base.FrameworkInitialize();
        string content = String.Empty;
        Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream( GetType().FullName + ".ascx" );
        using (StreamReader reader = new StreamReader(stream))
            content = reader.ReadToEnd();
        Control userControl = Page.ParseControl( content );
        this.Controls.Add( userControl );
    }
}

Этот базовый класс позаботится о загрузке и анализе встроенного файла ASCX.

7... Наконец, вам может потребоваться разместить файлы ASCX во вложенных папках, чтобы их имена ресурсов (автоматически определяемые по пути к папке) соответствовали полному типу имени ассоциированного класса (плюс). ASCX "). Предполагая, что ваше корневое пространство имен соответствует имени вашего проекта, класс с именем" ProjectName.Namespace1.Namespace2.ClassName "будет нуждаться в его файле ASCX в подпапке" Namespace1\Namespace2 ", поэтому он будет внедрен с именем" ProjectName.Namespace1.Namespace2 ". ClassName.ascx".

И это! После того как вы скомпилируете DLL и включите его в другой проект, вы можете создавать экземпляры своих пользовательских элементов управления с помощью "нового" оператора, как и любого другого класса. Как всегда, ваш контроль будет "привязан" к текущему событию страницы, однажды добавленному в качестве дочернего элемента управления на страницу или другой элемент управления на странице.

Ответ 2

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

Ответ 3

Другим способом было бы преобразование пользовательского элемента управления в пользовательский элемент управления. Существует хорошая статья о MSDN: включение пользовательского элемента .ascx в распространяемый настраиваемый элемент управления, который описывает, как это сделать. Вот резюме:

  • Создайте свой пользовательский элемент управления, как обычно, используя конструктор Visual Studio.
  • Протестируйте его с помощью простой страницы, прежде чем пытаться ее развернуть.
  • Разверните приложение, чтобы прекомпилировать его.
  • Возьмите узел управления пользователя, созданный на этапе развертывания, и вы по существу сделаны: у вас есть свой собственный контроль.
  • Наконец, используйте свой собственный элемент управления в других приложениях так же, как вы всегда используйте настраиваемые элементы управления.

Надеюсь, что это поможет.

Ответ 4

Мне пришлось сделать это один раз, и я последовал этой статье

http://www.codeproject.com/KB/user-controls/EmbeddedUserControl.aspx

Он основан на возможности монтировать виртуальную файловую систему в разных местах (сборка, база данных и т.д.)