Ответ 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 и включите его в другой проект, вы можете создавать экземпляры своих пользовательских элементов управления с помощью "нового" оператора, как и любого другого класса. Как всегда, ваш контроль будет "привязан" к текущему событию страницы, однажды добавленному в качестве дочернего элемента управления на страницу или другой элемент управления на странице.