Связывание сборок с частичными классами - PullRequest
1 голос
/ 09 декабря 2011

У меня есть общий проект, который называется общий. Внутри находится класс ExtensionMethods, который используется устаревшими приложениями. Я хочу разбить класс на несколько файлов, но сохранить имя одинаковым. Поэтому вместо public static class ExtensionMethods {} у меня много public static partial class ExtensionMethods {}.

Когда я отбрасываю новую dll, созданную из частичных классов, я получаю исключение Method not found: одним из устаревших приложений, использующих dll. Чем это вызвано? Информация о имени файла как-то встроена в dll? Делают ли частичные классы старые и новые dll несовместимыми? В чем дело? DLL не является версионной, и мы не используем GAC. Это просто dll, помещенная в тот же каталог, что и exe.

Обновление: Спасибо всем за предложения. Вот что я проверил до сих пор
то же пространство имен: check.
те же подписи: проверьте.
все еще публично: проверьте.

Я могу собрать устаревшее приложение, и оно собирается без ошибок.

Да, исключение говорит мне, что это за метод. Метод не найден:

'System.Collections.Generic.IEnumerable\`1<!!0> CompanyName.Common.ExtentionMethods.Distinct(System.Collections.Generic.IEnumerable\`1<!!0>, System.Func\`3<!!0,!!0,Boolean>)'.

(К сожалению, неправильное написание слова «Extension» - это то, что есть в коде.)

Я начну использовать некоторые инструменты, предложенные вами всеми, чтобы посмотреть дальше.

old dll new dll

Ответ: Ошибка пользователя. DLL, которую я думал, что скопировал, не была новой библиотекой, которую я думал, что строил. Я не могу понять, нужна ли была перестройка, проблема с контролем исходного кода или просто моя ошибка. В любом случае, оба приведенных ниже ответа были правильными, частичные занятия не были проблемой, и оба ответа были полезны, но, в конце концов, я думаю, что это было отражающее решение, которое привело меня к поиску проблемы. Спасибо всем.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Предполагая, что все классы объявлены в одном и том же пространстве имен, это должно быть абсолютно нормально. Проверка:

  • что все классы находятся в одном и том же пространстве имен (поэтому у вас есть только один класс с этим именем в результирующей сборке, а не несколько классов в разных пространствах имен)
  • что ваши сигнатуры методов точно такими, какими они были раньше - типы параметров, имена методов и т. Д. Не могут измениться
  • что методы все еще общедоступны

Что произойдет, если вы попытаетесь собрать устаревшее приложение для своей новой DLL? Это должно показать, что метод отсутствует во время компиляции, что должно дать вам подсказку о том, где вы идете не так. Имейте в виду, предположительно, исключение «Метод не найден» должно сообщить вам , какой метод все равно не найден ...

2 голосов
/ 09 декабря 2011

Частичные классы - это трюк с компилятором, и ничего более - в окончательной сборке нет существенной разницы.

Итак, я думаю, что ваша настоящая проблема кроется в другом.

Проверьте сведения об исключении, которое вы получаете, и просмотрите источник для этого конкретного метода.

Кроме того, воспользуйтесь инструментом проверки, таким как Reflector или dotPeek , чтобы найти класс / метод в самой сборке, и вы должны найти проблему довольно быстро.

...