【问题标题】:Compile web application project ascx into dll将 web 应用程序项目 ascx 编译成 dll
【发布时间】:2010-05-10 20:34:34
【问题描述】:

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

我想做以下事情:

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

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

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

有什么想法吗?我是不是搞错了,我应该改变方法吗?

【问题讨论】:

  • 您是否分析了我粘贴的解决方案?它非常适合创建用户控件库。如果可能的话,我会避免创建用户控件库,但如果你没有选择,请查看文章

标签: asp.net user-controls


【解决方案1】:

转换很容易,甚至可以完全自动化。它只需要更改您希望嵌入 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”的类将需要其 ASCX 文件位于子文件夹“Namespace1\Namespace2”中,因此它嵌入名称为“ProjectName.Namespace1.Namespace2”。类名.ascx"。

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

【讨论】:

  • 我尝试在创建非常复杂的控件时使用这种方法,但没有奏效。显然问题出在 ParseControl 方法中,该方法无法处理 Eval 和 Bind 等数据绑定表达式。有什么想法吗?
  • 这太棒了。我已经设法让它通过一些调整来工作。第 7 步不是必需的,它不喜欢为每个命名空间设置子目录,但在根目录下可以工作。每个前端控件都必须通过 this.FindControl('litOutput'); 手动声明/注册;并且事件必须在后端注册。除此之外,到目前为止我没有其他问题!
  • 我在 ParseControl 方法中有一个异常。它试图解析 ascx 文件的 'Inherits="Namespace.Class"' 部分,但找不到提到的类型。所以我从我的 ascx 文件中删除了 Inherits 部分,它起作用了。
  • 在 WebApp 中编译和使用 dll 后,我收到错误消息:“无法加载类型 WebApp.UserControls.MyControl”,它指的是 ascx 文件中的这一行:&lt;%@ Control Language="vb" CodeBehind="MyControl.ascx.vb" Inherits="WebApp.UserControls.MyControl" %&gt; .这是我的解决方案结构:WebApp.sln > WebApp、WebApp.UserControls。 “WebApp.UserControls”项目具有以下文件: MyControl.ascx 和 MyControl.ascx.vb -- 您能否阐明目录结构和 ` 标记以及它们之间的关系整个系统?
【解决方案2】:

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

【讨论】:

  • 我要补充一点,如果用户控件不是高度复合的,那么这是最不痛苦的方法。事实上,我已经重构了代码,因此我的 ascx 文件不是复合控件,只是为了更容易将它们制作成服务器控件,这些控件通常继承自一些内置的 ASP.NET 控件。
  • 在这种情况下,创建自定义控件并不是一个真正的选择,我从第三方获取代码,然后我试图将其嵌入到 3 个不同的网站中。我无法控制如何获取代码,也不想将其重新写入自定义控件,尤其是因为他们提供的每次更新都必须重新编写。
  • 与其试图将用户控件插入一个可以引用的 dll 中,不如在每个 Web 应用程序中使用用户控件的源代码并使用源代码控制(例如 subversion's外部特征。 justaddwater.dk/2007/10/23/…
【解决方案3】:

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

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

希望这会有所帮助。

【讨论】:

    【解决方案4】:

    我必须这样做一次,然后我按照这篇文章进行操作

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

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

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 这两个链接都涉及网站项目,据我所知,您无法将资源嵌入到网站项目中
      【解决方案6】:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 2011-10-19
        • 1970-01-01
        • 2012-11-02
        相关资源
        最近更新 更多