C# 为什么我需要一个重新编译的页面,当它使用的方法发生变化?

C# 为什么我需要一个重新编译的页面,当它使用的方法发生变化?,c#,asp.net,web-site-project,C#,Asp.net,Web Site Project,我有一个aspx页面,它在App Code文件夹中的类中使用了一个方法,doSomething(int[]x)。我将函数定义更改为使用IEnumerable而不是数组:doSomething(IEnumerable x)。接下来,我使用“允许网站可更新”预编译了该网站,并发布了新的App_Code.dll。现在,页面的预编译版本在运行时给出了一个服务器错误:“找不到方法”。 如果我同时发布为页面“App\u Web\uu[page].aspx.[random].DLL”生成的DLL,它会正常工作

我有一个aspx页面,它在App Code文件夹中的类中使用了一个方法,doSomething(int[]x)。我将函数定义更改为使用IEnumerable而不是数组:
doSomething(IEnumerable x)
。接下来,我使用“允许网站可更新”预编译了该网站,并发布了新的App_Code.dll。现在,页面的预编译版本在运行时给出了一个服务器错误:“找不到方法”。
如果我同时发布为页面“App\u Web\uu[page].aspx.[random].DLL”生成的DLL,它会正常工作。看来函数的签名以某种方式嵌入了编译过的页面中…?这是为什么?在更改现有代码时,有没有办法避免此问题?

我讨厌每次更改公共类中的代码时都更新所有页面DLL。

如果是web应用程序,那么每次更改服务器端代码时都需要重新编译—不管它是在单独的程序集中还是在web应用程序的App_code文件夹中


只有网站(不是web应用程序)允许您在不重新编译的情况下更改代码。

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


只有网站(不是web应用程序)允许您在不重新编译的情况下更改代码。

您需要重新编译,因为您的页面已发布并输出到bin文件夹中的dll。此dll正在查找签名为的方法:

doSomething(int[])
它已经不存在了。发布时,每次都要更新所有内容



我相信“Updateable”(可更新)标志允许您更新aspx代码(即标记),但代码隐藏文件将被编译掉。

您需要重新编译,因为您的页面已发布并输出到bin文件夹中的dll。此dll正在查找签名为的方法:

doSomething(int[])
它已经不存在了。发布时,每次都要更新所有内容



我相信“可更新”标志允许您更新aspx代码(即标记),但代码隐藏文件将被编译掉。

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

例如,假设你有一个像

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_代码文件夹中(限制),等等,我可以在这里继续下去……

当一个页面被编译时,它会查看所有的方法签名,并基本上锁定它们。如果更改所调用方法的签名,则在重新编译之前,页面将无法找到该方法

例如,假设你有一个像

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_代码文件夹中(限制),等等。我可以在这里继续

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

以下类型的更改可能会导致运行时异常:
更改方法的签名或属性的类型。如果 已编译的页面引用了受影响的成员 将引发异常。某些签名