C# 使用ClientBuildManager.CompileFile进行就地编译
我正在一个网站上工作,我想使用就地编译,以使第一次点击更快。我想用这个。方法进行就地编译,以便我可以控制编译过程。出于各种原因,这是编辑此网站的理想方式 为什么IIS构建到“临时ASP.NET文件”下的不同子目录? 当我通过一个文件一个文件地编译网站时。方法在为此目的构建的exe中,输出将转到“临时ASP.NET文件”下的子目录。但是,当稍后访问网站时,IIS会在“临时ASP.NET文件”下的不同子目录下重建控件,从而使以前的就地编译变得毫无价值 注意:就地编译过程中在“临时ASP.NET文件”下创建的程序集不受影响(仍然存在) 注意:就地编译程序集文件夹和IIS生成的程序集文件夹都位于同一个“临时ASP.NET文件”目录下 例如:C# 使用ClientBuildManager.CompileFile进行就地编译,c#,asp.net,iis-7,.net-4.0,C#,Asp.net,Iis 7,.net 4.0,我正在一个网站上工作,我想使用就地编译,以使第一次点击更快。我想用这个。方法进行就地编译,以便我可以控制编译过程。出于各种原因,这是编辑此网站的理想方式 为什么IIS构建到“临时ASP.NET文件”下的不同子目录? 当我通过一个文件一个文件地编译网站时。方法在为此目的构建的exe中,输出将转到“临时ASP.NET文件”下的子目录。但是,当稍后访问网站时,IIS会在“临时ASP.NET文件”下的不同子目录下重建控件,从而使以前的就地编译变得毫无价值 注意:就地编译过程中在“临时ASP.NET文件”
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ASP.NET临时文件\root\2ba591b9\[就地编译文件夹名称]
- C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ASP.NET临时文件\root\2ba591b9\[IIS为网站生成的程序集]\
其中,
RootVirtualPath
仅为默认网站的“”RootPhysicalPath
指向网站在磁盘上的位置<代码>相对虚拟路径的格式为“~/myFile.aspx”。回调用于跟踪进度。我认为您看到的实际上与CompileFile
vsPrecompileApplication
的使用无关。i、 e.如果您执行相同的操作,但调用预编译应用程序()
,您仍然会得到一个文件夹不匹配
请注意,从技术上讲,您没有正确创建CBM对象。调用它的正确方法是依赖IIS信息来定位文件。为此:
- 将类似于
的内容传递给/LM/W3SVC/7/ROOT/
appVirtualDir
- 为
appPhysicalSourceDir
- 运行inetmgr
- 转到站点的高级设置
- 在
/LM/W3SVC/ID/ROOT/
- 在站点中包含一个页面,用于触发选择性预编译
- 在那里,调用
,并对要预编译的每个页面(或用户控件等)进行类似的调用BuildManager.GetCompiledType(“~/myfile.aspx”)
- 当您想要触发自定义预编译时,只需请求该页面
当然,也有一种低技术的选择,即只要求提前编译页面以预热站点。Sam,答案是David Ebbo的答案与原始代码的交叉
var buildParameter = new ClientBuildManagerParameter
{
PrecompilationFlags = PrecompilationFlags.Default,
};
var clientBuildManager = new ClientBuildManager(
RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);
如果您按照David Ebbo所说的做,并在构建ClientBuildManager时将其用于RootVirtualPath:
/LM/W3SVC/7/ROOT/
然后必须为RootPhysicalPath传递null
这将消除其余的问题,并将其构建到IIS正在查找的同一目录中。我猜,使用此代码,即使调用了
PrecompileApplication
而不是CompileFile
,它们也不会出现在同一文件夹中。我已经有一段时间没有看这些东西了,所以我可能需要挖掘来源。谢谢你的回复。那么你有没有在某个时间点做过类似的工作你提到它以前有用,所以你让我好奇。我将尝试让网站上的一个页面进行编译,看看它是否也能起到作用。我在ASP.NET 2.0的时间框架内编写了这段代码,我知道它当时可以工作,但那是很久以前的事了(将近10年!)。随着时间的推移,它可能会被打破,特别是当我们从IIS6迁移到IIS7时:(我猜最近没有多少人尝试这种就地编译。但我认为基于运行时的方法会起作用。你是对的。添加IIS路径为“/LM/W3SVC/[SITE ID]/ROOT/”就像appVirtualDir
一样,然后为appPhysicalSourceDir
传递null
就成功了。请注意,你必须为appPhysicalSourceDir
传递null
才能让它工作。谢谢。你一直都有答案。我想我第一次没有仔细阅读它。这个方法有效吗对于重新编译已更改的视图?我的MVC ASP.NET应用程序上有一个插件体系结构,因为该视图是在请求时编译的,当删除和重新安装插件视图时,我会得到一个缺少的程序集/命名空间异常。我试图强制服务器在新插件目录中重新编译视图。有指针吗?thxFWIW,当我在使用aspnet\u compiler.exe-m
时遇到了同样的问题,我必须将路径指定为/LM/W3SVC//ROOT
,而不带尾随斜杠。否则,编译输出将放在错误的目录中。
var buildParameter = new ClientBuildManagerParameter
{
PrecompilationFlags = PrecompilationFlags.Default,
};
var clientBuildManager = new ClientBuildManager(
RootVirtualPath, RootPhysicalPath, null, buildParameter);
...
clientBuildManager.CompileFile(relativeVirtualPath, callback);