Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ClientBuildManager.CompileFile进行就地编译_C#_Asp.net_Iis 7_.net 4.0 - Fatal编程技术网

C# 使用ClientBuildManager.CompileFile进行就地编译

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文件”

我正在一个网站上工作,我想使用就地编译,以使第一次点击更快。我想用这个。方法进行就地编译,以便我可以控制编译过程。出于各种原因,这是编辑此网站的理想方式

为什么IIS构建到“临时ASP.NET文件”下的不同子目录? 当我通过一个文件一个文件地编译网站时。方法在为此目的构建的exe中,输出将转到“临时ASP.NET文件”下的子目录。但是,当稍后访问网站时,IIS会在“临时ASP.NET文件”下的不同子目录下重建控件,从而使以前的就地编译变得毫无价值

注意:就地编译过程中在“临时ASP.NET文件”下创建的程序集不受影响(仍然存在)

注意:就地编译程序集文件夹和IIS生成的程序集文件夹都位于同一个“临时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
vs
PrecompileApplication
的使用无关。i、 e.如果您执行相同的操作,但调用
预编译应用程序()
,您仍然会得到一个文件夹不匹配

请注意,从技术上讲,您没有正确创建CBM对象。调用它的正确方法是依赖IIS信息来定位文件。为此:

  • 将类似于
    /LM/W3SVC/7/ROOT/
    的内容传递给
    appVirtualDir
  • appPhysicalSourceDir
请注意,“7”只是一个示例。要获得正确的号码:

  • 运行inetmgr
  • 转到站点的高级设置
  • /LM/W3SVC/ID/ROOT/
我解释这一点是为了记录在案,因为不幸的是,即使这样,我也无法让文件夹匹配。这个场景可能是在ASP.NET中被破坏的(它曾经工作过!)

另一种可能性是在服务器端执行。e、 g

  • 在站点中包含一个页面,用于触发选择性预编译
  • 在那里,调用
    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);