澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

ZKWeb网址框架的动态编写翻译的完成原理,Net网址

ZKWeb网址框架是一个独立开采的网页框架,达成了动态插件和自行编写翻译功用。
ZKWeb把二个文本夹当成是一个插件,无需使用csproj或xproj等花样的门类文件管理,并且支持修改插件代码后自动重新编写翻译加载。

Vs200五和VS二〇一〇中都有树立web应用程序和Web网址,总搞的望族不知所戳。
web应用程序或许是微软为了让工程师很好的从winform过渡到web开荒而保留了。Web网址就全盘要选择到web开荒的。其实两个之间未有怎么大的界别,自身从表象总计了一晃他们的异同点。
相同:
一、都以统一计划Asp网页的。
二、都足以增多ASP.Net文件夹(都不外乎App_Browsers、App_Data、App_GlobalResources、App_LocalResources、App_Themes)。
不同:
1、web应用程序Default.aspx彰显有四个原有文件及Default.aspx.cs和Default.aspx.designer.cs;Web网址Default.aspx呈现有三个原始文件Default.aspx.cs。
贰、web应用程序有再次生成和宣布两项;Web网站唯有一个发布网址。
叁、web应用程序和一般的winform未有怎么分化都有引用的是命名空间等;Web网址在引用后现身2个bin文件夹这里存放dll和pdb文件。
四、web应用程序能够当做类库被引述;Web网址则不得以作为类库被引用。
伍、web应用程序能够加多ASP.Net文件夹中不包涵bin、App_Code;Web网址能够增加ASP.Net文件夹包蕴bin、App_Code。
6、web应用程序还可增加组件和类;Web网站则从未。
7、源文件即便都以Default.aspx.cs不过web应用程序有命名空间,多了壹项System.Collections空间引用。

如下所示创立1个简便的asp.Net Web应用程序

框架地址

上边将表明ZKWeb怎么着落到实处这些功效,您也得以参照上面包车型大巴代码和流程在团结的品种中达成。
ZKWeb的开源协议是MIT,有必要的代码可以向来搬,不供给操心协议难题。

 

                 澳门新浦京娱乐场网站 1


贯彻动态编写翻译重视的第3本领

编译: Roslyn Compiler
Roslyn是微软提供的开源的c# 陆.0编写翻译工具,能够通过Roslyn来支撑自宿主要编辑写翻译功用。
要利用Roslyn能够设置nuget包Microsoft.CodeAnalysis.CSharp
微软还提供了更简便易行的Microsoft.CodeAnalysis.CSharp.Scripting包,这一个包只需简单几行就能够兑现c#的动态脚本。

加载dll: System.Runtime.Loader
在.Net Framework中动态加载叁个dll程序集能够应用Assembly.LoadFile,不过在.Net Core中这么些函数被移除了。
微软为.Net Core提供了1套全新的顺序集处理机制,要求选拔AssemblyLoadContext来加载程序集。
不满的是本身还从未找到微软官方关于那方面包车型客车表明。

生成pdb: Microsoft.DiaSymReader.Native, Microsoft.DiaSymReader.PortablePdb
为了援救调节和测试编写翻译出来的程序集,还亟需生成pdb调节和测试文件。
在.Net Core中,Roslyn并不含有生成pdb的机能,还亟需设置Microsoft.DiaSymReader.NativeMicrosoft.DiaSymReader.PortablePdb本领支撑生成pdb文件。
安装了那个包以往Roslyn会自动识别并采纳。

原vs.net二零零六中尚无web应用程序项目。只有新建网址的法力。SP第11中学扩充了web应用程序的机能。此作用推出,满足了无数VS.NET200叁开销网址的意中大家。
vs2005的“网址”项目中。其实也可能有点优点。原来的vs200三和VS200伍SP第11中学的WEB应用程序.是将总体网址应用程序编写翻译成八个DLL。而网址项目中是对各类aspx生成的代码文件,单独编写翻译。特殊目录App_Code中代码文件才编写翻译成单独1个主次集。这种规划。能够单独生成三个页和该页程序集。上传的时候,能够只更新此页。
但以此“网站”项目,编写翻译速度慢,类型检查不到底。四个例外的ASPX能够调换同样的四个称呼的类。发表的时候,也极慢,会删除全部原始发表目录中的全体文件,且复制全部新的文本。并且中间还大概有停顿,必要用户积极按覆盖文件的按键才干揭破。
而在SP第11中学的WEB应用程序中,编写翻译和宣布速度中,分明变快,公布的时候一齐先就足以安装是不是覆盖。原来的网址要进步过来,供给生成三个企划类代码页。有了此文件,编写翻译的时候,编写翻译器就无须再深入分析ASPX页面了。明显加快了编写翻译速度。且只生成一个程序集。推行的速度页快了。
WebApplication编制程序模型的优点:
●编译速度快,使用非增量编写翻译情势,编写翻译成单独的dll方便管理,。
●生成的次序集
WebSite:生成随机的先后集名,需求经过插件WebDeployment才得以生成单一程序集
WebApplication:能够钦定网址项目改换单1程序集,因为是单独的程序集,所以和此外类型一律能够钦点应用程序集的名字、版本、输出地点等音讯
●能够将网址拆分成四个项目以方便管理
●能够从品种一月源代码管理中革除2个文件
●扶助VSTS的Team Build方便每日构建
●更有力的代码检查功效,并且检查攻略受源代码调整
●能够对编写翻译前后开始展览和煦鲜明的拍卖
●对App_GlobalResources 的Resource强类协助(网络说的,还未曾明白过)
●直接晋级使用VS200三创设的大型系统
WebSite编程模型的优点:
●动态编写翻译该页面,即刻能够看到作用,不用编写翻译整个站点(首要优势)
●同上,能够使错误的壹对和动用的一对不相干扰(能够供给只有编写翻译通过技能签入)
●能够每一个页面生成贰个程序集(不会选取这种艺术)
●能够把2个目录当做三个Web应用来管理,直接复制文件就足以公告,不需重要项目目文件(无所谓,只适合小站点)
●能够把页面也编写翻译到程序聚集(应该用不到,而且WebApplication也可以经过WebDeployment插件来促成)
二种编制程序模型的竞相转变:
VS200伍 SP1内置了转移程序,能够十三分便利的从WebSite调换来WebApplication
只须要复制文件,右键实行“转变为Web应用程序”即可。
未查到有特别的反向调换工具,但正如后意识只要转变也非常简单。
删去全数*.designer.cs
将*.aspx、*.ascx、*.master页面文件中的 Codebehind="FileList.aspx.cs" 批量替换到 CodeFile="FileList.aspx.cs"

 

新的文书档案地址

兑现动态编写翻译插件系统的流程

在ZKWeb框架中,插件是多个文件夹,网址的安排文件中的插件列表便是文本夹的列表。
在网址运维时,会寻觅每种文件夹下的*.cs文本比较文件列表和改变时间是或不是与上次编写翻译的不等,假若分化则再次编写翻译该公文夹下的代码。
网址运行后,会监视*.cs*.dll文件是还是不是有变动,假若有变动则另行开动网址以重新编写翻译。
ZKWeb的插件文件夹结构如下

  • 插件文件夹
    • bin:程序集文件夹
      • net: .Net Framework编写翻译的主次集
        • 插件名称.dll: 编写翻译出来的次第集
        • 插件名称.pdb: 调节和测试文件
        • CompileInfo.txt: 储存了文件列表和修改时间
      • netstandard: .Net Core编写翻译的程序集
        • 同net文件夹下的剧情
    • src 源代码文件夹
    • static 静态文件的文本夹
    • 其余文件夹……

在VS中生成消除方案以往,能够在档期的顺序的目录下看看以下的文件:


透过Roslyn编写翻译代码文件到程序集dll

在网址运转时,插件管理器在得到插件文件夹列表后会使用Directory.EnumerateFiles递归查找该文件夹下的享有*.cs文件。
在获得这几个代码文件路线后,我们就足以传给Roslyn让它编写翻译出dll程序集。
ZKWeb调用Roslyn编写翻译的全部代码能够查阅这里,下边表达编写翻译的流水生产线:

先是调用CSharpSyntaxTree.ParseText来剖判代码列表到语法树列表,大家能够从源代码列表得出List<SyntaxTree>
parseOptions是分析选项,ZKWeb会在.Net Core编写翻译时定义NETCORE标识,那样插件代码中能够使用#if NETCORE来定义.Net Core专项使用的拍卖。
path是文本路径,必须传入文件路线能力调度生成出来的程序集,不然固然生成了pdb也不能捕捉断点。

// Parse source files into syntax trees
// Also define NETCORE for .Net Core
var parseOptions = CSharpParseOptions.Default;
#if NETCORE
parseOptions = parseOptions.WithPreprocessorSymbols("NETCORE");
#endif
var syntaxTrees = sourceFiles
    .Select(path => CSharpSyntaxTree.ParseText(
        File.ReadAllText(path), parseOptions, path, Encoding.UTF8))
.ToList();

接下去需求分析代码中的using来寻觅代码重视了怎么程序集,并逐条载入这么些程序集。
举例境遇using System.Threading;会尝试载入SystemSystem.Threading程序集。

// Find all using directive and load the namespace as assembly
// It's for resolve assembly dependencies of plugin
LoadAssembliesFromUsings(syntaxTrees);

LoadAssembliesFromUsings的代码如下,就算相比较长可是逻辑并不复杂。
关于IAssemblyLoader将在背后解说,这里只必要掌握它可以按名称载入程序集。

/// <summary>
/// Find all using directive
/// And try to load the namespace as assembly
/// </summary>
/// <param name="syntaxTrees">Syntax trees</param>
protected void LoadAssembliesFromUsings(IList<SyntaxTree> syntaxTrees) {
    // Find all using directive
    var assemblyLoader = Application.Ioc.Resolve<IAssemblyLoader>();
    foreach (var tree in syntaxTrees) {
        foreach (var usingSyntax in ((CompilationUnitSyntax)tree.GetRoot()).Usings) {
            var name = usingSyntax.Name;
            var names = new List<string>();
            while (name != null) {
                // The type is "IdentifierNameSyntax" if it's single identifier
                // eg: System
                // The type is "QualifiedNameSyntax" if it's contains more than one identifier
                // eg: System.Threading
                if (name is QualifiedNameSyntax) {
                    var qualifiedName = (QualifiedNameSyntax)name;
                    var identifierName = (IdentifierNameSyntax)qualifiedName.Right;
                    names.Add(identifierName.Identifier.Text);
                    name = qualifiedName.Left;
                } else if (name is IdentifierNameSyntax) {
                    var identifierName = (IdentifierNameSyntax)name;
                    names.Add(identifierName.Identifier.Text);
                    name = null;
                }
            }
            if (names.Contains("src")) {
                // Ignore if it looks like a namespace from plugin 
                continue;
            }
            names.Reverse();
            for (int c = 1; c <= names.Count;   c) {
                // Try to load the namespace as assembly
                // eg: will try "System" and "System.Threading" from "System.Threading"
                var usingName = string.Join(".", names.Take(c));
                if (LoadedNamespaces.Contains(usingName)) {
                    continue;
                }
                try {
                    assemblyLoader.Load(usingName);
                } catch {
                }
                LoadedNamespaces.Add(usingName);
            }
        }
    }
}

经过地点这一步后,代码依赖的全数程序集应该都载入到当下历程中了,
笔者们必要找寻这个程序集并且传给Roslyn,在编写翻译代码时引用那些程序集文件。
上面包车型地铁代码生成了三个List<PortableExecutableReference>对象。

// Add loaded assemblies to compile references
var assemblyLoader = Application.Ioc.Resolve<IAssemblyLoader>();
var references = assemblyLoader.GetLoadedAssemblies()
    .Select(assembly => assembly.Location)
    .Select(path => MetadataReference.CreateFromFile(path))
    .ToList();

构建编写翻译选项
此处需求调用微软非公开的函数WithTopLevelBinderFlags来安装IgnoreCorLibraryDuplicatedTypes。
其壹标记让Roslyn能够忽略System.Runtime.Extensions和System.Private.CoreLib中另行的品种。
如果急需让Roslyn平时专门的职业在windows和linux上,必须安装那个标志,具体能够看
Roslyn Scripting暗中同意会利用这么些标记,操蛋的微软

// Create compilation options and set IgnoreCorLibraryDuplicatedTypes flag
// To avoid error like The type 'Path' exists in both
// 'System.Runtime.Extensions, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
// and
// 'System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
var compilationOptions = new CSharpCompilationOptions(
    OutputKind.DynamicallyLinkedLibrary,
    optimizationLevel: optimizationLevel);
var withTopLevelBinderFlagsMethod = compilationOptions.GetType()
    .FastGetMethod("WithTopLevelBinderFlags", BindingFlags.Instance | BindingFlags.NonPublic);
var binderFlagsType = withTopLevelBinderFlagsMethod.GetParameters()[0].ParameterType;
compilationOptions = (CSharpCompilationOptions)withTopLevelBinderFlagsMethod.FastInvoke(
    compilationOptions,
    binderFlagsType.GetField("IgnoreCorLibraryDuplicatedTypes").GetValue(binderFlagsType));

末段调用Roslyn编写翻译,传入语法树列表和引用程序集列表能够获取目的程序集。
使用Emit函数编写翻译后会重回2个EmitResult对象,里面保存了编写翻译中出现的一无所能和警示新闻。
瞩目编写翻译出错开上下班时间Emit不会抛出不一样,须求手动物检疫查EmitResult中的Success属性。

// Compile to assembly, throw exception if error occurred
var compilation = CSharpCompilation.Create(assemblyName)
    .WithOptions(compilationOptions)
    .AddReferences(references)
    .AddSyntaxTrees(syntaxTrees);
var emitResult = compilation.Emit(assemblyPath, pdbPath);
if (!emitResult.Success) {
    throw new CompilationException(string.Join("rn",
        emitResult.Diagnostics.Where(d => d.WarningLevel == 0)));
}

到此已经完结了代码文件(cs)到程序集(dll)的编写翻译,上面来看怎么载入这些程序集。

                     澳门新浦京娱乐场网站 2

请参见上述的文书档案以赢得最新的新闻。

载入程序集

在.Net Framework中,载入程序集文件极其轻巧,只必要调用Assembly.LoadFile
在.Net Core中,载入程序集文件供给定义AssemblyLoadContext,并且有着有关的先后集都急需通过同1个Context来载入。
亟需注意的是AssemblyLoadContext不可能用在.Net Framework中,ZKWeb为了排除这几个出入定义了IAssemblyLoader接口。
完全的代码能够查阅
IAssemblyLoader
CoreAssemblyLoader
NetAssemblyLoader

.Net Framework的载入只是调用了Assembly中原来的函数,这里就不再表明了。
.Net Core使用的载入器定义了AssemblyLoadContext,代码如下:
代码中的plugin.ReferenceAssemblyPath指的是插件自带的第1方dll文件,用于载入插件重视然而主项目中从不引用的dll文件。

/// <summary>
/// The context for loading assembly
/// </summary>
private class LoadContext : AssemblyLoadContext {
    protected override Assembly Load(AssemblyName assemblyName) {
        try {
            // Try load directly
            return Assembly.Load(assemblyName);
        } catch {
            // If failed, try to load it from plugin's reference directory
            var pluginManager = Application.Ioc.Resolve<PluginManager>();
            foreach (var plugin in pluginManager.Plugins) {
                var path = plugin.ReferenceAssemblyPath(assemblyName.Name);
                if (path != null) {
                    return LoadFromAssemblyPath(path);
                }
            }
            throw;
        }
    }
}

定义了LoadContext从此要求把那些类设为单例,载入时都由此这么些Context来载入。
因为.Net Core方今无法获得到具备已载入的程序集,只好获取程序本人信赖的先后集列表,
那边还增加了2个ISet<Assembly> LoadedAssemblies用以记录历史载入的有所程序集。

/// <summary>
/// Load assembly by name
/// </summary>
public Assembly Load(string name) {
    // Replace name if replacement exists
    name = ReplacementAssemblies.GetOrDefault(name, name);
    var assembly = Context.LoadFromAssemblyName(new AssemblyName(name));
    LoadedAssemblies.Add(assembly);
    return assembly;
}

/// <summary>
/// Load assembly by name object
/// </summary>
public Assembly Load(AssemblyName assemblyName) {
    var assembly = Context.LoadFromAssemblyName(assemblyName);
    LoadedAssemblies.Add(assembly);
    return assembly;
}

/// <summary>
/// Load assembly from it's binary contents
/// </summary>
public Assembly Load(byte[] rawAssembly) {
    using (var stream = new MemoryStream(rawAssembly)) {
        var assembly = Context.LoadFromStream(stream);
        LoadedAssemblies.Add(assembly);
        return assembly;
    }
}

/// <summary>
/// Load assembly from file path
/// </summary>
public Assembly LoadFile(string path) {
    var assembly = Context.LoadFromAssemblyPath(path);
    LoadedAssemblies.Add(assembly);
    return assembly;
}

到此处一度能够载入编写翻译的次序集(dll)文件了,上面来看什么落到实处修改代码后自行重新编写翻译。

 


检查实验代码文件变化并机关心珍惜新编写翻译

ZKWeb使用了FileSystemWatcher来检验代码文件的调换,完整代码能够翻开这里。
主要的代码如下

// Function use to stop website
Action stopWebsite = () => {
    var stoppers = Application.Ioc.ResolveMany<IWebsiteStopper>();
    stoppers.ForEach(s => s.StopWebsite());
};
// Function use to handle file changed
Action<string> onFileChanged = (path) => {
    var ext = Path.GetExtension(path).ToLower();
    if (ext == ".cs" || ext == ".json" || ext == ".dll") {
        stopWebsite();
    }
};
// Function use to start file system watcher
Action<FileSystemWatcher> startWatcher = (watcher) => {
    watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
    watcher.Changed  = (sender, e) => onFileChanged(e.FullPath);
    watcher.Created  = (sender, e) => onFileChanged(e.FullPath);
    watcher.Deleted  = (sender, e) => onFileChanged(e.FullPath);
    watcher.Renamed  = (sender, e) => { onFileChanged(e.FullPath); onFileChanged(e.OldFullPath); };
    watcher.EnableRaisingEvents = true;
};
// Monitor plugin directory
var pathManager = Application.Ioc.Resolve<PathManager>();
pathManager.GetPluginDirectories().Where(p => Directory.Exists(p)).ForEach(p => {
    var pluginFilesWatcher = new FileSystemWatcher();
    pluginFilesWatcher.Path = p;
    pluginFilesWatcher.IncludeSubdirectories = true;
    startWatcher(pluginFilesWatcher);
});

ZKWeb网址框架的动态编写翻译的完成原理,Net网址的的编写翻译与发表原理。这段代码监视了插件文件夹下的cs, json, dll文件,
假设产生变化就调用IWebsiteStopper来终止网址,网址后一次开辟时将会再一次编写翻译和载入插件。
IWebsiteStopper是贰个虚幻的接口,在Asp.Net中停止网址调用了HttpRuntime.UnloadAppDomain,而在Asp.Net Core中甘休网航站调度室用了IApplicationLifetime.StopApplication

Asp.Net甘休网址会卸载当前的AppDomain,下一次刷新网页时会自动重新启航。
而Asp.Net Core结束网址会终止当前的进程,使用IIS托管时IIS会在活动重启进度,但选择自宿主时则要求借助外部工具来重启。

 

ZKWeb是一个首要快速支付和模块开垦的网站框架。

写在最后

ZKWeb网址框架的动态编写翻译的完成原理,Net网址的的编写翻译与发表原理。ZKWeb达成的动态编写翻译技能小幅度的压缩了付出时的等候时间,
重在节省在无需每一次都按火速键编写翻译和没有要求像任何模块化开垦同样供给从子项目复制dll文件到主项目,倘诺dll文件较多而且用了教条硬盘,复制时间只怕会比编写翻译时间还要悠久。

自己将会在那几个博客继续分享ZKWeb框架中应用的本领。
只要有不掌握的片段,接待参加ZKWeb调换群52208388陆打探,

当大家通过VS将网址发表出来之后,能够见见,最后生成的文书,如下图所示:

提供了动态插件和电动管理数据库结构的效用。

                         澳门新浦京娱乐场网站 3

模板系统和自动生成页面参照他事他说加以考察了Django的做法,并听从Don't repeat yourself原则。

 

关键效能

  • .Net Core支持
    • 补助运转在.Net Framework和.Net Core上
  • 插件系统
    • 使用Roslyn
    • 援助动态加载插件
    • 帮衬修改插件源代码后自行重新编译和加载
  • 模板系统
    • 使用DotLiquid
    • 援救Django风格的模板重载
    • 支撑手提式有线电话机版专项使用模板(优先从templates.mobile读取模板内容)
    • 协理区域和针对区域的动态内容,能够在那基础上贯彻可视化编辑
    • 协理对页面中的部分剧情开展独立缓存,能够大幅度进步页面包车型大巴响应速度
  • IoC容器
    • 轻量且快捷
    • 暗许支持使用性质注册程序集中的花色到容器
    • 支撑构造函数注入
  • 扶助八个框架的托管
    • 扶助托管在Asp.Net
    • 援助托管在Asp.Net Core
    • 协理托管在Owin
    • 插件不须要理会托管在哪些框架,使用抽象层就能够
  • 支撑七个OLacrosseM
    • 支持Dapper
    • 支持EntityFramework Core
    • 支持InMemory
    • 支持MongoDB
    • 支持NHibernate
      • NHibernate还不能够运作在.Net Core上
    • NHibernate和EFCore补助运行时自动更新数据表结构,无需手动员搬迁移
    • OLX570M有联合的抽象层,一份代码可以而且在享有O福睿斯M上运营,但无法促成完全同盟
  • 本地化
    • 支撑多语言
    • 支撑多时区
    • 提供了gettext风格的翻译函数
  • 测试
    • 支撑在调节台和网页运营测试
    • 支撑在测试中重载IoC容器
    • 支撑在测试中重载Http上下文
    • 支撑在测试中央银行使有的时候数据库
  • 花色工具
    • 提供成立项目利用的工具
    • 提供公布项目选拔的工具

 

私下认可插件集中的重要效率

  • 自动生成和注明表单
  • 自动生成Ajax表格
  • 自动生成CRUD页面
  • 定时职务
  • 验证码
  • 管制后台(使用AdminLTE)
  • 活动伪静态,大致未有额外费用
  • 多货币和多国家援助
  • 越来越多职能请查看各插件的文书档案

我们能够开采,发表之后的类别文件夹内少了成千上万文本,其实那是VS将aspx页面和一般管理程序以及Global文件等的后台文件都编写翻译成了四个dll文件,那些dll文件存放在bin文件夹内:

品类地址


                         澳门新浦京娱乐场网站 4

DEMO

地址:

用户名: demo

密码: 123456

 

类型进程

中央框架已公布规范的本子。
作业插件仍在编制,目的是运用那套框架做八个开源的百货市4系统。

讨论QQ群:522083886

 

对那些程序集进行反编写翻译之后,能够见到大家写的后台代码都编写翻译到那个dll文件中了

                       澳门新浦京娱乐场网站 5

 

以此是形似管理程序的ProcessRequest方法中的代码,能够见见正是我们写的源代码:

                         澳门新浦京娱乐场网站 6

 

此刻项目文件夹内的多少个文件中只剩下部分简练的扬言了,全数后台代码都曾经丢掉了:

Global文件:澳门新浦京娱乐场网站 7

 

诚如管理程序:

澳门新浦京娱乐场网站 8

aspx页面:

澳门新浦京娱乐场网站 9

 

 

 

下一场大家透过以下那句代码分别收获页面,一般管理程序以及Global编译运转时所在的职责:

        System.Reflection.Assembly.GetExecutingAssembly().Location

 

由此比照能够窥见Global文件、一般管理程序、aspx后台代码所在的先后集文件为同叁个,而aspx前台页面包车型客车代码运维在另二个先后聚集,以下为运转的结果:

 

Global和aspx页面的前台与后台运维文件:澳门新浦京娱乐场网站 10

相似管理程序的后台代码:

澳门新浦京娱乐场网站 11

 

 

咱俩得以见见IIS运营网址时,实际将网址编写翻译之后的dll文件都放到了相应的Framework版本中的不经常文件夹中了

即在C:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Files下,网址中友好写的后台代码与类库以及引用的类库都被编写翻译到了那么些有时文件夹下当前项目所在的公文夹下的**assembly文件下。澳门新浦京娱乐场网站,**

 

 

网址揭橥后的文本布满图:

澳门新浦京娱乐场网站 12

 

 

 

 

 

那会儿对照发布的网址根目录下的bin文件夹里的dll文件和一般管理程序运营时所在的程序集,能够窥见两个是同贰个文本:

         澳门新浦京娱乐场网站 13

 

 

那会儿只要除去网址根目录先的bin文件夹内的dll,然后再浏览页面内,能够窥见网址不能平常运营:

        澳门新浦京娱乐场网站 14

 

由地点的结果能够看看,即便网址中早就存在了八个后台代码的dll文件,然而网址实际运营的是系统文件夹中的那个dll文件,那些应该是一向从网址中拷贝过去的,它们的MD5值完全同样。

在那边能够臆想,对于asp.Net应用程序来讲,IIS只会编写翻译aspx页面,一般管理程序,Global等文件,可是不会编写翻译其余的类公事,全部的类公事对IIS来讲未有用处,IIS只可以使用编写翻译好的dll文件。

 

 

 

当网址正在周转时,不恐怕删除系统文件夹中的那个dll文件,展现被IIS Worker Process占用,那几个尤其证实网站实际运作时接纳的是其一dll文件

 

 

澳门新浦京娱乐场网站 15

 

那么那个IIS Worker Process进程是何等吧,当大家甘休近些日子网站对应的w三wp.exe进度时,系统文件夹中dll被成功删除,那么些能够注明,这些dll的调用者便是w3wp.exe那个实行,也认证了w三wp.exe是网址的劳作经过。

 

 

当大家删除系统文件夹中的dll文件时,再一次访问网址时会重新在系统文件夹中再一次生成dll文件,而且首先次访问时候报错:

                澳门新浦京娱乐场网站 16

 

 

再次访问就像是常了

 澳门新浦京娱乐场网站 17

 

 

总结:

就此能够总计出,在IIS中运作asp.Net应用程序时,前台页面包车型大巴代码是即时张开立异和编写翻译的,当大家修改前台代码时,无需再度编写翻译项目依然重新公布网站,在做客网址时,IIS(恐怕.Net框架?)检查评定到页面发生了改变会帮大家再次编译页面,而在修改了后台代码和别的的类公事的时候就要求大家手动对源代码进行再一次编写翻译了。

 

 



以上的内容都以本着Asp.Net应用程序来讲的

 

 

对此Asp.Net网站来说发表网址时不会将页面和一般管理程序以及其它部分代码编写翻译成dll文件,只会将源文件和引用的局地类库拷贝到网址的目录下,对于减轻方案中的其他类库,也会在编写翻译好之后再拷贝到Bin文件夹中。

在这里能够想见,在asp.Net网址中,IIS或然别的的顺序,在有人第二次访问网站时,将App_Code文件里的源代码编写翻译成了dll程序集

                 澳门新浦京娱乐场网站 18

当用户率先次呼吁时才开始展览即时编写翻译,编写翻译好的文本也是存在于系统文件夹下

如:C:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Filesroot7812c4be73872874

那时变化的文书有以下那个:

                     澳门新浦京娱乐场网站 19

 

 

一向在VS中调治将养时,情状与上述在IIS中运作类似,只是最终所在的文件目录有所差别,而且会转变大多调护医疗用的公文:

C:WindowsMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Fileswebsite1e58724ca4f149c8

             澳门新浦京娱乐场网站 20           

 

 

 

 

总结:

         Web应用程序和Web网址的前台页面的代码都以在网址运转时,被第三拜访时进行编写翻译的,而对此后台代码和网址中的一些类公事来讲,Web网址也会在网站率先次被访问的时候被编写翻译,所以,Web网址中的后台代码更换后没有要求手动实行编写翻译,而在Web应用程序中,后台代码和类公事都会在公告的时候进行编写翻译,编写翻译成功能力够健康宣布,所以对于Web应用程序,修改了后台代码就不可能不重新编译然后公布。

 

 

 

注:**网址编写翻译的一时目录能够在IIS中如故Web.config配置文件中展开安插,一下是IIS中的修章:**

在劳动器级或然网址级的".Net编译"选项中期维修改编写翻译的暂且目录,私下认可景况下有时目录为网址对应的.Net Framework的版本下的Temporary ASP.NET Files文件夹。

澳门新浦京娱乐场网站 21

澳门新浦京娱乐场网站 22

 

 

本文由澳门新浦京娱乐场网站发布于www.146.net,转载请注明出处:ZKWeb网址框架的动态编写翻译的完成原理,Net网址