Мы столкнулись с проблемой, связанной с продвижением по службе, и я надеюсь, что смогу объяснить ее кодом. Я хочу понять, почему он ведет себя так, как он есть.Попытка понять изменения подписи метода, охватывающие сборки
Ассамблея 1
public static class Foo
{
public static string DoStuff()
{
// Do something
return "some string";
}
}
Ассамблея 2:
public class Bar
{
public void SomeMethod()
{
// I realize the below is not what should be done for catching exceptions, as the exception is never thrown due to the return, and seems unnecessary either way...
// this is inherited code and has not been modified to correct.
try
{
var someValue = Foo.DoStuff();
}
catch (Exception)
{
return;
throw;
}
}
}
требования изменились так, что DoStuff необходимо будет принимать в качестве параметра, значение которого будет немного изменить поведение. Обратите внимание, что изменяется только сборка 1.Foo.
Новый Foo
public static class Foo
{
public static string DoStuff(bool someBool = false)
{
// Do something
return "some string";
}
}
Это Перекомпилирован хорошо, и сборка 2 был в состоянии успешно использовать измененную сигнатуру метода без жалоб. Моя проверка была выполнена, и проектные DLL, у которых были изменения, были повышены (обратите внимание, что это была только сборка 1-й сборки).
После раскрутки мы обнаружили, что сборка 2 не срабатывала по вызову Foo.DoStuff() - к сожалению, я не могу предоставить исключение, поскольку приведенный выше код проглотил его.
Несмотря на то, что в сборке 2 фактический код не изменился, он, похоже, повлиял на dll при перекомпиляции, хотя подпись метода - по крайней мере, на мой взгляд - одинакова из-за предоставления значения по умолчанию для новый параметр.
Я использовал функцию dotnet peek, чтобы заглянуть в «старую dll» и «новые dll» (даже если код не изменился на эту сборку и не заметил разницу в двух DLL в том, что в старой DLL, значение параметра по умолчанию не был поставлен, но в перекомпиляции параметр значение по умолчанию подавался
Я думаю, мой вопрос (ы) сводятся к следующему:.
- Почему скомпилированный код на изменения в сборе 2 основанный на сигнатуре метода, который (по крайней мере, я думаю) должен быть прозрачным?
- Будет ли метод избегать такая ситуация просто «развернуть все»? Вместо того, чтобы пытаться развернуть на основе изменений кода? Обратите внимание, что библиотеки DLL не проверяются, так что не было никакого фактического «изменение кода» для сборки 2, хотя DLL отличается на основе изменений в Ассамблее 1.
Другим способом избежать этой ситуации было бы оставить метод с параметрами без изменений и вызвать его новый метод со значением по умолчанию, а не указывая значение по умолчанию в сигнатуре метода: 'public static string DoStuff() {return DoStuff (false); } '. Также было бы полезно удалить «возврат» из этого улова (или, по крайней мере, занести в журнал исключение). –
@RufusL Если бы я мог все это сделать, зная, что я знаю сейчас, это определенно было бы тем подходом, который я бы взял;) – Kritner