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

时间:2010-05-10 20:34:34

标签: asp.net user-controls

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

我想做以下事情:

  1. 在多个网站中使用相同的控件
  2. 将css和.js作为资源嵌入控件
  3. 能够更新超级简单。如果用户控件更新,我只想更新1 .dll
  4. 我已成功完成了这篇文章http://msdn.microsoft.com/en-us/library/aa479318.aspx

    但是,它使用网站项目,我无法将js css作为资源嵌入到网站项目中。

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

6 个答案:

答案 0 :(得分: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>

看起来像这样

<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”的类将需要其子文件夹“Namespace1 \ Namespace2”中的ASCX文件,因此它将嵌入名称“ProjectName.Namespace1.Namespace2”。 ClassName.ascx”。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

另一种方法是将用户控件转换为自定义控件。 MSDN: Turning an .ascx User Control into a Redistributable Custom Control上有一篇很好的文章,它描述了如何做到这一点。以下是摘要:

  
      
  1. 像往常一样编写用户控件,通常使用Visual Studio设计器。
  2.   
  3. 在尝试部署之前使用简单页面对其进行测试。
  4.   
  5. 部署应用程序以预编译它。
  6.   
  7. 抓取部署步骤生成的用户控件的程序集,   而且你基本上已经完成了:你有自定义控件。
  8.   
  9. 最后,以与您相同的方式在其他应用中使用自定义控件   总是使用自定义控件。
  10.   

希望这有帮助。

答案 3 :(得分:0)

我必须这样做一次并且我遵循了这篇文章

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

它基于在不同位置(程序集,数据库等)安装虚拟文件系统的可能性

答案 4 :(得分:0)

答案 5 :(得分:0)

我知道这是旧的,但是可能的是......我一直这样做,请参阅https://kocubinski.wordpress.com/2013/05/06/compile-asp-net-webforms-ascx-usercontrols-into-assembly-for-re-use/