繁体   English   中英

为什么更改的页面使用的方法需要重新编译的页面?

[英]Why do I need a recompiled page when a method used by it changes?

我有一个aspx页面,该页面在App Code文件夹doSomething(int[] x)的类中使用了一种方法。 我将函数定义更改为使用IEnumerable而不是数组: doSomething(IEnumerable<int> x) 接下来,我使用“允许网站可更新”对网站进行了预编译,并发布了新的App_Code.dll。 现在,该页面的预编译版本在运行时给出服务器错误:“找不到方法”。
如果我还发布为页面生成的DLL“ App_Web_ [page] .aspx。[random] .dll”,则它可以工作。 因此,该函数的签名似乎以某种方式嵌入了已编译的页面中……? 为什么会这样,并且在更改现有代码时有办法避免此问题?
每当我更改公共类中的代码时,我都不愿更新所有页面DLL。

编译页面时,它会查看所有方法签名,并实质上将其锁定。 如果您更改正在调用的方法的签名,则在重新编译页面之前,该页面将无法找到它。

例如,假设您有一个像

public class Dog {
  public void Walk(Int32 distance) {
    /// blah blah
  }
}

然后在后面的页面代码中调用此代码:

protected void MyButtonClick(....) {
  Dog d = new Dog();
  d.Walk(3000);
}

当向下编译时,页面将期望带有Int32签名的walk方法。

现在,假设我们将Dog类中的walk方法更改为:

public void Walk(Int16 distance) {
  // blah blah
}

(是的,愚蠢的更改,但突出了问题所在)。 此时,页面将无法找到采用Int32参数的Walk方法,因此将无法正常运行。


仅部署您认为需要的一个程序集似乎很不错,但是事实上,代码中可能发生了许多更改,因此这是一个严重的错误做法。

确保整个项目是一致的更好。 甚至更大的网站也不需要花很长时间来部署。

当然,我认为使用网站项目本身都是不好的做法。 将未编译的代码部署到服务器( 确实很糟糕 ),即使您已明确告诉它要使用哪个程序集( 通常是意外的,永远不好 ),并且所有主代码都位于一个公共app_code文件夹中,VS仍会搜索您的驱动器以更新项目中的引用。 ( 限制 )等。我可以继续在这里...

如果是Web应用程序,则每次更改服务器端代码时都需要重新编译-不管它是在单独的程序集中还是在Web应用程序的App_Code文件夹中。

只有网站(而非Web应用程序)允许您更改代码而无需重新编译。

您需要重新编译,因为您的页面已发布并输出到bin文件夹中的dll中。 该dll正在寻找具有以下特征的方法:

doSomething(int[])

而且它不再存在。 发布时,每次都更新所有内容。


我相信'updatable'标志允许您更新aspx代码(即标记),但是隐藏在文件后面的代码将被删除。

以下类型的更改可能会导致运行时异常:
更改方法的签名或属性的类型。 如果已经编译的页面引用了受影响的成员,则将引发异常。 如果重新编译整个站点,则某些签名更改将不会导致编译或运行时错误。 例如,无论MethodA返回int还是short,.aspx页中的代码Response.Write(ClassA.MethodA()都可以编译并正常运行。但是,如果.aspx页已经编译,并且您更改了MethodA的返回类型,从int到short而无需重新编译,则将引发运行时异常,因为编译后的代码需要int签名。

来自http://msdn.microsoft.com/zh-cn/library/ms366723.aspx#sectionToggle5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM