Краткий ответ: потому что они были явно разработаны таким образом .Т.е. помощники должны быть внутренними по отношению к тем частям, которые в них нуждаются, и не должны быть помещены в «Common.dll или Helpers.dll».Длинный ответ, возможно, с более подробной информацией об этом решении, может быть предоставлен только (оригинальным) автором.
Относительно вашего исходного вопроса: вы, вероятно, включили бы этого помощника в несколько проектов.если вы действительно хотите, чтобы они жили в отдельной сборке, и не хотите изменять код (изменение внутреннего на общедоступный), вы можете использовать атрибут InternalsVisibleTo для этой сборки, в котором перечислены все другие ваши проекты / сборки, которые нужныиспользовать их.Нельзя сказать, что это хорошее решение - оно работает явно против первоначального дизайна NetFx - но по крайней мере оно избавит вас от ручного труда при обновлении.
В общем, я бы не стал принимать решение о зеленом полелибо («обычная» DLL, либо строго локальная функция).У обоих есть свои очевидные плюсы и минусы.Но вы не спрашивали об этой части истории, то есть, кажется, вы уже приняли решение; -)