将web应用程序项目ascx编译为dll

cjb*_*kha 11 asp.net user-controls

是否可以将Web应用程序项目.ascx(用户控件)编译为dll?

我想做以下事情:

  1. 在多个网站中使用相同的控件
  2. 将css和.js作为资源嵌入到控件中
  3. 能够更新超级简单.如果用户控件更新,我只想更新1 .dll

我已经成功地阅读了这篇文章,http://msdn.microsoft.com/en-us/library/aa479318.aspx.

但是,它使用网站项目,我不能将js css作为资源嵌入到网站项目中.

有任何想法吗?如果我改变方法,我是否会犯这个错误?

Tri*_*nko 6

转换很简单,甚至可以完全自动化.它只需要更改您希望嵌入ASCX控件的DLL项目中的一些设置和基类.

1 ...对于每个UserControl,将ASCX文件的Build Action(在Properties下)设置为"Embedded Resource",并删除其关联的设计器文件.

2 ...保存项目.

3 ...右键单击项目,然后选择"卸载项目".

4 ...再次右键单击它并选择"编辑*.csproj"选项.

更改看起来像这样的部分(星号代表您的类名):

<Compile Include="*.ascx.cs">
    <DependentUpon>*.ascx</DependentUpon>
    <SubType>ASPXCodeBehind</SubType>
</Compile>
Run Code Online (Sandbox Code Playgroud)

看起来像这样

<Compile Include="*.ascx.cs" />
Run Code Online (Sandbox Code Playgroud)

这将导致代码隐藏文件独立于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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

该基类将负责加载和解析嵌入的ASCX文件.

7 ...最后,您可能需要将ASCX文件放在子文件夹中,以便它们的资源名称(由文件夹路径自动确定)与其关联类的完整类型名称(加上".ascx")匹配.假设您的根命名空间与您的项目名称匹配,那么名为"ProjectName.Namespace1.Namespace2.ClassName"的类将需要其子文件夹"Namespace1\Namespace2"中的ASCX文件,因此它将嵌入名称"ProjectName.Namespace1.Namespace2". ClassName.ascx".

就是这样!编译DLL并将其包含在另一个项目中后,您可以使用"new"运算符实例化用户控件的实例,就像任何其他类一样.与往常一样,一旦作为子控件添加到页面或页面上的另一个控件,您的控件将"捕获"到当前页面事件.


Ben*_*son 3

由于标记 ascx 文件,很难以这种方式使用用户控件。如果您想创建可重用的控件库,最好创建自定义控件。