В качестве прямого ответа решение, предоставляемое несколькими, включая @Esko , с использованием Arrays.toString
и Arrays.deepToString
, является просто лучшим.
Ниже я пытаюсь перечислить некоторые из других предложенных методов, пытающихся немного улучшить, причем наиболее заметным дополнением является использование оператора Stream.collect
с использованием joining
Collector
, чтобы имитировать то, что делает String.join
.
int[] ints = new int[] {1, 2, 3, 4, 5};
System.out.println(IntStream.of(ints).mapToObj(Integer::toString).collect(Collectors.joining(", ")));
System.out.println(IntStream.of(ints).boxed().map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(ints));
String[] strs = new String[] {"John", "Mary", "Bob"};
System.out.println(Stream.of(strs).collect(Collectors.joining(", ")));
System.out.println(String.join(", ", strs));
System.out.println(Arrays.toString(strs));
DayOfWeek [] days = { FRIDAY, MONDAY, TUESDAY };
System.out.println(Stream.of(days).map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(days));
// These options are not the same as each item is printed on a new line:
IntStream.of(ints).forEach(System.out::println);
Stream.of(strs).forEach(System.out::println);
Stream.of(days).forEach(System.out::println);
Да, общие файлы (если по какой-либо причине вы не хотите размещать их в GAC) можно развернуть, например, в папке Common Programs .
к способу работы вашего приложения вам может понадобиться загрузить их с помощью Assembly.LoadFrom () , используя путь, который вы получаете из Environment.GetSpecialFolder () для среды . SpecialFolders.CommonPrograms или присоединение и обработчик событий для события AppDomain.AssemblyResolve .
Давайте посмотрим на простой и простой пример:
// Put this in your initialization code
public static void Main()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveAssembly(MyResolveEventHandler);
}
private static Assembly ResolveAssembly(object sender, ResolveEventArgs e)
{
// Clean, check, double check and verify path name to be sure it's a valid
// assembly name and it's not a relative path itself, you may even check e.RequestingAssembly
string path = ...;
return Assembly.LoadFrom(path);
}
Если у вас есть каталог, и вы хотите загрузить их при запуске (на всякий случай ...):
private static LoadThemAll(folderPath)
{
foreach (var path in Directory.GetFiles(folderPath, "*.dll"))
Assembly.LoadFrom(path);
}
Не забудьте добавить правильную обработку ошибок (для неконтролируемых DLL, неправильных версий и все остальное может произойти, особенно потому, что эти сборки будут загружены в ваш AppDomain, и каждый может поместить вредоносный в эту папку).
Конечно, все они могут быть применены к любой (доступной) папке, которая один лучший ... ну, это зависит от того, что вы tr ying для загрузки и того, как он развернут (вы даже можете искать в реестре, чтобы динамически находить, где находятся файлы поддержки).
Наконец, если сборки, на которые вы ссылались, являются сильными, и они находятся на известном, фиксированном, неизменяемом вы можете использовать <codebase>
в вашем файле .config.
Мы использовали пробный путь в приложениях asp.net, чтобы сделать что-то подобное в прошлом:
http://msdn.microsoft.com/en-us/library/823z9h8w. aspx
Имеет побочный эффект в asp.net, где сборки в этих местах не будут загружаться автоматически при запуске приложения, только когда их невозможно найти в корзине.