Bin 与 App_code 文件夹

最近新升级了Visual Studio 2017,创建的Web项目Bin目录中多了一个叫roslyn的文件夹,该文件夹导致网站在某些服务器上发布出错

        如果您的Web应用程序包括要在多个页之间共享的代码,您可以将代码保存在   Web   应用程序根目录下的两个特殊文件夹(Bin文件夹和App_Code文件夹)中的某个文件夹中。   
    
        Bin文件夹   
        可以在Bin文件夹中存储编译的程序集,并且Web应用程序任意处的其他代码(如页代码)会自动引用该文件夹。典型的示例是您为自定义类编译好的代码。您可以将编译后的程序集复制到Web应用程序的Bin文件夹中,这样所有页都可以使用这个类。   
    
        Bin文件夹中的程序集无需注册。只要 .dll 文件存在于Bin文件夹中,ASP.NET就可以识别它。如果您更改了.dll 文件,并将它的新版本写入到了Bin文件夹中,则ASP.NET会检测到更新,并对随后的新页请求使用新版本的.dll文件。   
    
        Bin文件夹的安全性   
        将编译后的程序集放入Bin文件夹中会带来安全风险。如果是您自己编写和编译的代码,那么您了解代码的功能。但是,您必须像对待任何可执行代码一样来对待Bin文件夹中已编译的代码。在完成代码测试并确信已了解代码功能之前,要对已编译的代码保持谨慎的态度。   
    
        请注意以下安全方面的知识,这些知识与是否将已编译的代码放入Bin 文件夹有关:   
        Bin文件夹中程序集的作用范围为当前应用程序。因此,它们无法访问当前Web应用程序之外的资源或调用当前Web应用程序之外的代码。   
        运行时,程序集的访问级别由本地计算机上指定的信任级别确定。有关更多信息,请参见ASP.NET信任级别和策略文件。   
        如果您使用了诸如Visual Studio 这样的设计器,那么Bin文件夹中的代码运行所在的上下文与运行时不同。例如,代码可能以完全信任状态运行。     
    
        App_Code   文件夹   
        可以在App_Code文件夹中存储源代码,在运行时将会自动对这些代码进行编译。Web   应用程序中的其他任何代码都可以访问产生的程序集。因此,App_Code文件夹的工作方式与Bin文件夹很类似,不同之处是您可以在其中存储源代码而非已编译的代码。App_Code 文件夹及其在ASP.NET Web应用程序中的特殊地位使您可以创建自定义类和其他仅源代码文件,并在Web应用程序中使用它们而不必单独对它们进行编译。   
    
        App_Code文件夹可以包含以传统类文件(即带有.vb、.cs等扩展名的文件)的形式编写的源代码文件。但是,它也可以包含并非明确显示出由某一特定编程语言编写的文件。例如.wsdl(Web服务发现语言)文件和XML架构 (.xsd)文件。ASP.NET可以将这些文件编译成程序集。   
    
        根据您的需要,App_Code文件夹可以包含任意数量的文件和子文件夹。您可以采用任何您认为方便的方式组织源代码,ASP.NET仍会将所有代码编译成单个程序集,并且Web应用程序任意处的其他代码都可以访问该程序集。   
    
        推断App_Code文件夹的编程语言   
        App_Code文件夹并未显式标记为包含以任何一种编程语言编写的文件。相反,ASP.NET是根据App_Code文件夹所包含的文件来推断应为App_Code文件夹调用哪一种编译器。如果   App_Code文件夹包含.vb文件,则ASP.NET使用Visual Basic编译器;如果包含.cs文件,则ASP.NET使用C#编译器,以此类推。   
    
        如果App_Code文件夹只包含并未明确表明编程语言的文件(如.wsdl文件),则ASP.NET将使用Web应用程序的默认编译器,默认编译器在Web应用程序或计算机配置文件的compilation元素中确定。   
    
        在App_Code文件夹中使用多种编程语言   
        因为App_Code文件夹中的源代码要编译成单个程序集,所以App_Code文件夹中的所有文件必须使用相同的编程语言编写。例如,App_Code文件夹不能同时包含采用Visual Basic和C#编写的源代码。     
    
        但是,您可以对Web应用程序进行配置,使其将App_Code文件夹的子文件夹作为独立的可编译单元处理。这样,每一个文件夹就可以包含以不同编程语言编写的源代码。通过在Web.config文件的codeSubDirectories元素中创建一个compilation元素,然后添加一个对子文件夹的引用,即可指定该配置。下面的示例阐释如何对名为VBCode和CSCode的子文件夹进行配置,使其编译成不同的程序集:  
   
    复制到剪贴板<compilation   debug="false">  
          <codeSubDirectories>  
                  <add   directoryName="VBCode"   />  
                  <add   directoryName="CSCode"   />  
          </codeSubDirectories>  
  </compilation>   
        请注意,对VBCode和CSCode子文件夹的引用并未包括任何有关子文件夹中所包含的编程语言的信息。就像对待App_Code文件夹本身一样,ASP.NET会根据子文件夹中的文件来推断要使用的编译器。   
    
        App_Code 文件夹的安全性   
        App_Code

.net项目有两个生成事件:预先生成事件和后期生成事件。如下截图:

图片 1

文件夹中的代码存在的安全问题基本上与Bin文件夹中的代码存在的安全问题相同

代码都会在运行时编译成程序集。比Bin文件夹要好一些的是,您可以阅读App_Code文件夹中文件的源代码。但是,如果您不能完全理解代码,仍然会存在安全风险。因此,对待App_Code 文件夹中的源代码的态度必须像对待基于同样的源代码生成的已编译代码一样谨慎。


        ASP.NET 2.0 引入了 App_Code 目录,该目录可以包含一些独立文件,这些文件包含要在应用程序中的多个页之间共享的代码。与 ASP.NET 1.x 不同 (1.x 需要将这些文件预编译到 Bin 目录),App_Code 目录中的所有代码文件都将在运行时动态编译,然后提供给应用程序。可以在 App_Code 目录下放置多种语言的文件,前提是将这些文件划分到各子目录中(在 Web.config 中用特定语言注册这些子目录)。默认情况 下,App_Code 目录只能包含同一种语言的文件。但可以将 App_Code 目录划分为若干子目录(每个子目录包含同一语言的文件)以便可以在 App_Code 目录下包含多种语言。为此,需要在应用程序的 Web.config 文件中注册每个子目录。
<configuration>
   <system.web>
     <compilation>
       <codeSubDirectories>
         <add directoryName="Subdirectory"/>
       </codeSubDirectories>
     </compilation>
   </system.web>
</configuration>

        以上是关于 App_Code 的官方描述。描述中提到“运行时动态编译”,为了弄清楚 App_Code 目录下的文件在何时编译,于是写了段程序进行测试

TestClass.cs

 1图片 2public class TestClass
 2图片 3图片 4图片 5{
 3图片 6  public static int m_Count = 0;
 4图片 7  public TestClass()
 5图片 8图片 9   图片 10{
 6图片 11     m_Count ;
 7图片 12   }
 8图片 13  public string GetMessage(string str)
 9图片 14图片 15   图片 16{
10图片 17     "Hello : "   str;
11图片 18   }
12图片 19}
13图片 20

ASPX 页中的代码

图片 21图片 22<%图片 23TestClass t = new TestClass();%>
图片 24<%=t.GetMessage("SoftDiyer")%><br>
图片 25m_Count=<%=TestClass.m_Count%>

        在两个 ASPX (Test1.aspx 和 Test2.aspx)页中放了这些代码,先访问 Test1.aspx   , m_Count=1; 然后再访问 Test2.aspx m_Count=2;修改 TestClass.cs 中的内容重新访问 Test2.aspx , m_Count =1;由此看出 .net 框架在监视 App_Code 目录,当目录中的文件发生变化时,触发 .net 的动态编译。

        App_Code 、 Asp 的 Include 、.Net 中的 Import 的比较:
        App_Code 与asp 中的 include 不同:App_Code 采用编译机制而 asp 中的 include 采用的是解释的机制 ,表面上看实现的目的和方式有点类似,但是处理方式完全不同。使用代码目录方式使程序变的更高效更容易维护。
        App_Code 和 Import 的不同:从调用代码看区别在于,使用 Import 时必须在文件中使用 Import 语句,而代码目录方式不需要。使用 Import 语句一般是使用已经编译好的类,在运行之前已经编译好了。而代码目录则在运行时编译,这样就增加了程序的灵活性。

图片 26

 

在这两个事件中我们可以实现我们的一些与编译相关的需求,比如编译完成后将某些文件打包并传输到发布服务器上等。

从网上搜索了一下,Roslyn是新出的动态编译工具

这里要介绍的一个应用案例如下:我们发布Job的流程是将Debug或Release重命名为Bin,然后将Bin目录和App.config

图片 27

压缩成zip包。

 

第一步:在预先生成事件中清除上次打包的文件和目录(如果有的话),包括删除文件夹$(ProjectDir)binbin,

本文由糖果派对电玩城发布于用户反馈,转载请注明出处:Bin 与 App_code 文件夹

您可能还会对下面的文章感兴趣: