Зачем мне перекомпилированная страница, когда метод, используемый ею, изменяется? - PullRequest
0 голосов
/ 03 февраля 2012

У меня есть страница aspx, которая использовала метод в классе в папке кода приложения, doSomething(int[] x). Я изменил определение функции, чтобы использовать IEnumerable вместо массива: doSomething(IEnumerable<int> x). Затем я предварительно скомпилировал веб-сайт, используя «разрешить обновление веб-сайта», и опубликовал новый App_Code.dll. Теперь предварительно скомпилированная версия страницы выдает ошибку сервера во время выполнения: «Метод не найден».
Если я также опубликую DLL, сгенерированную для этой страницы, «App_Web_ [page] .aspx. [Random] .dll», это работает. Похоже, подпись функции как-то встроена в скомпилированную страницу…? Почему это так, и есть ли способ избежать этой проблемы при изменении существующего кода?
Я бы не хотел обновлять все библиотеки DLL моей страницы всякий раз, когда я изменял код в моих общих классах.

Ответы [ 4 ]

3 голосов
/ 08 марта 2012

Когда страница компилируется, она просматривает все сигнатуры методов и по существу блокирует их.Если вы измените сигнатуру вызываемого метода, страница не сможет найти его, пока он не будет перекомпилирован.

Например, допустим, у вас есть класс, такой как

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

и вы вызываете это в коде страницы:

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

Когда это скомпилируется, страница будет ожидать метод ходьбы с сигнатурой Int32.

Теперь, скажем, мы изменим метод ходьбыв классе Dog:

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

(да, глупые изменения, но это выдвигает на первый план проблему).На этом этапе страница не сможет найти метод Walk, который принимает параметр Int32 и, следовательно, будет взорван, как и должно быть.


Может показаться приятным просто развернуть одну сборку, которую вы считаете нужнойнужно, но в том-то и дело, что в коде может произойти любое количество изменений, так что это очень плохая практика.

Гораздо лучше убедиться, что весь проект согласован.Даже большие сайты не занимают так много времени для развертывания.

Конечно, я думаю, что использование проектов веб-сайтов в любом случае является плохой практикой.Развертывая нескомпилированный код на сервере ( очень плохо ), VS ищет ваш диск для обновления ссылок в проекте, даже если вы явно указали ему, какую сборку использовать ( обычно неожиданно, никогда не хорошо ), имея весь основной код в общей папке app_code ( ограничение ) и т. д. Я мог бы продолжать и продолжать здесь ...

1 голос
/ 03 февраля 2012

Если это веб-приложение, то вам нужно перекомпилировать каждый раз, когда вы изменяете код на стороне сервера - не имеет значения, находится ли он в отдельной сборке или в папке App_Code вашего веб-приложения.

Только веб-сайт (не веб-приложение) позволяет изменять код без перекомпиляции.

0 голосов
/ 08 марта 2012

Следующие виды изменений могут вызывать исключения во время выполнения:
Изменение подписи метода или типа свойства.Если на затронутый элемент ссылается уже скомпилированная страница, будет выдано исключение.Некоторые изменения подписи не будут вызывать ошибки компиляции или времени выполнения, если весь сайт будет перекомпилирован.Например, код Response.Write (ClassA.MethodA () на странице .aspx будет компилироваться и выполняться нормально, если MethodA возвращает int или short. Но если страница .aspx уже скомпилирована, и вы изменяете тип возвращаемого значения MethodAот int до short без перекомпиляции, будет сгенерировано исключение времени выполнения, потому что скомпилированный код ожидает сигнатуру int.

From http://msdn.microsoft.com/en-us/library/ms366723.aspx#sectionToggle5

0 голосов
/ 08 марта 2012

Вам нужно перекомпилировать, потому что ваша страница была опубликована и выведена в dll в папке bin.Эта dll ищет метод с подписью:

doSomething(int[])

И его там больше нет.Когда вы публикуете, обновляйте все, каждый раз.


Я считаю, что флаг «обновляемый» позволяет вам обновлять код aspx (то есть разметку), но файлы с кодовыми кодами будут компилироваться.

...