c # ссылочная сборка в относительном пути простой способ [дублировать]

Arrays.toString

В качестве прямого ответа решение, предоставляемое несколькими, включая @Esko , с использованием Arrays.toString и Arrays.deepToString , является просто лучшим.

Java 8 - Stream.collect (joining ()), Stream.forEach

Ниже я пытаюсь перечислить некоторые из других предложенных методов, пытающихся немного улучшить, причем наиболее заметным дополнением является использование оператора 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);
0
задан Adriano Repetti 24 July 2013 в 12:48
поделиться

2 ответа

Да, общие файлы (если по какой-либо причине вы не хотите размещать их в 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.

0
ответ дан Adriano Repetti 26 August 2018 в 04:04
поделиться

Мы использовали пробный путь в приложениях asp.net, чтобы сделать что-то подобное в прошлом:

http://msdn.microsoft.com/en-us/library/823z9h8w. aspx

Имеет побочный эффект в asp.net, где сборки в этих местах не будут загружаться автоматически при запуске приложения, только когда их невозможно найти в корзине.

1
ответ дан David Bennington 26 August 2018 в 04:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: