【问题标题】:Does an assembly maintain its directory structure?程序集是否维护其目录结构?
【发布时间】:2009-04-25 04:29:29
【问题描述】:
  1. 既然一个 web 项目中的所有文件都被编译成一个程序集,那么这个程序集是否维护一个目录结构?例如,如果根目录中的文件引用子目录中的文件,那么当这两个文件被编译到同一个程序集中时,这个引用怎么可能仍然有效?

  2. 假设一个 web 项目具有如下所示的目录结构。 由于所有 Web 项目的 ASPX 文件都被编译成一个程序集WebProject1.dll,这个程序集如何能够记录/记忆目录结构? 因此,当您将WebProject1.dll 部署到Web 服务器并且用户向http://WebProject1/some_SubDir/default.aspx 发出请求时,WebProject1.dll 将如何确定要呈现哪个页面?

    WebProject1\SubDir(其中 WebProject1 是根目录) WebProject1 -- 包含几个 ASPX 文件 WebProject1\SubDir -- 包含一个文件 default1.aspx

  3. 当我们部署 Web 项目时,我们是否必须在 Web 服务器 (WebProject1\SubDir) 上创建相同的目录结构,即使我们不会将任何 ASPX 文件放入这些目录中?

  4. 我假设Web服务器上的WebProject1.dll应该放在Bin目录下?

感谢


编辑:


只有源代码被编译成程序集,你仍然需要将aspx文件上传到服务器上的匹配目录中。

我的书说,当使用 Web 项目时,所有 Web 代码都被编译成单个程序集。我以为“所有代码”都包含 aspx 文件?!


通过类声明在页面和它的代码隐藏文件之间维护链接,默认情况下,该类声明位于与目录结构匹配的命名空间中

所以如果我通过Project --> Add New Item添加一个新的aspx页面,并将这个aspx页面存储在一个名为Hey的子目录中,那么这个页面就会驻留在命名空间WebProject1.Hey?!

但是我如何将新项目添加到子目录中,因为 Project --> Add New Item 没有给我一个选项来浏览和选择我希望保存它的目录,而是自动在根目录中创建 aspx 文件?


编译器生成dll时会保留相对路径。

我不确定我知道你指的是什么相对路径?


感谢

【问题讨论】:

  • 回答您的其他问题: Aspx 文件不是代码,它们是决定如何格式化代码输出的标记文件。文件后面的代码(带有 cs 或 vb 扩展名)是被编译的代码。如果要将页面添加到子目录中 - 右键单击​​解决方案资源管理器中的目录并从那里添加新项目。页面/代码模型的更深入解释可以在msdn.microsoft.com/en-us/library/015103yb(vs.71).aspx 找到
  • “我认为“所有代码”都包含 aspx 文件?!”。不,您可以尝试在没有 aspx 文件的情况下部署 dll,您的网站将无法运行。实践总是比书本好。
  • "您可以尝试在没有 aspx 文件的情况下部署 dll,您的站点将无法运行。"到目前为止,由于 IIS 不断报告异常,我无法部署我的 dll。”一旦我弄清楚为什么这让我很难过,我会做一些练习,谢谢大家的大力帮助

标签: c# asp.net assemblies asp.net-2.0


【解决方案1】:

只有源代码被编译成程序集,您仍然需要将 aspx 文件上传到服务器上的匹配目录中。例如,您在 Visual Studio 中的项目可能如下所示:

WebProject1 (The root project)
  |
  |- some_SubDir (A physical directory inside the project)
      |
      |-default1.aspx
      |-default1.aspx.cs (assuming a C# project)

编译网络应用后,您需要将以下内容上传到服务器:

WebProject1 (The root directory for your website)
 |
 |-bin (The binary directory created by the build)
    |
    |-WebProject1.dll (The compiled source code of the web app)
 |-some_SubDir
    |
    |-default1.aspx (The file that will map to the URL www.websitename.com/some_subdir/default1.aspx)

已编译资源(已编译并存储在程序集中的非源代码文件)是您的 other question 中解决的不同问题


已编辑以添加对问题的直接答案:

  1. 并非所有文件都编译到程序集中,只有源代码文件。通过类声明在页面和它的代码隐藏文件之间维护链接,默认情况下,该类声明位于与目录结构匹配的命名空间中,但并非必须如此。

  2. 您的 default1.aspx 文件将在标题中包含如下内容:

inherits 行告诉网络服务器,当用户请求此页面时,它应该与定义该类的源代码一起处理,它将在编译的程序集中找到。物理 aspx 文件和编译后的类的组合将生成标准 html,然后将其传递回客户端。

  1. 是的,您需要创建相同的目录结构,但您需要将 aspx 文件放入其中。

(如果有人知道如何让列表项正确编号,可以编辑一下吗?)

【讨论】:

    【解决方案2】:

    所有这些路径信息都将作为元数据/资源文件嵌入,因此,您可以将其安全地部署到服务器。编译器生成dll时会保留相对路径。

    我建议你使用Reflector打开dll,你可以更深入地了解dll里面的内容。

    【讨论】:

      【解决方案3】:

      注意 some_Subdir/default1.apsx 如何在页面声明中有一个“继承”键/值对?

      这意味着当您请求该资源时,IIS 会发出“啊哈! Asp.Net 需要处理这个请求!嘿 asp.net 请给我一些 html 以发送下来'

      Asp.net 解析该 aspx 文件并动态创建从 WebProject1.some_Subdir._Default1 继承的代理类。然后这个代理类解析出控制树和 html,并开始页面生命周期(这被过度简化了,我确定我错过了一些细节)。

      因此,WebProject1.dll 只是您的 Web 应用程序的实际 C#/VB,但与 asp.net 工作进程和标记相结合,您可以将 html 呈现回客户端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-24
        相关资源
        最近更新 更多