DllImport вместо медленного Assembly.LoadFrom - PullRequest
3 голосов
/ 25 февраля 2010

У меня есть пара библиотек ресурсов, которые я загружаю в настоящее время, когда приложение начинает использовать следующий код:

Assembly ass = Assembly.LoadFrom(fi.FullName);
Type t = ass.GetTypes()[0];
string ns = t.Namespace;
BaseFacade bf = Activator.CreateInstance(t) as BaseFacade;

// bf.GoWild()...

Когда у меня есть этот BaseFacade, я без ума от вызова функций для получения ресурсов из DLL, и все это прекрасно работает. Однако этот начальный LoadFrom очень медленный, и для 10 DLL у меня это занимает более 30 секунд.

Итак, мне было интересно альтернативные подходы? Есть ли? Мне было интересно, если это возможно сделать что-то вроде:

[DllImport("myResources1.dll")]
public static extern void GoWild();

[DllImport("myResources2.dll")]
public static extern void GoWild();

?? Если это возможно, как бы я раскрыл эти функции GoWild для библиотек ресурсов? Кроме того, как бы я указал приложению на местоположение библиотек DLL, учитывая, что они не всегда находятся в каталоге основной библиотеки DLL (и пользователь имеет возможность перемещать эти библиотеки DLL)?

Спасибо за любые советы по этому вопросу!

Ответы [ 3 ]

3 голосов
/ 25 февраля 2010

Одна вещь, которая может улучшить производительность, - это не извлекать все типы из загруженной сборки. Если они такие большие (10 МБ), я предполагаю, что в каждом из них есть значительное количество типов, через которые Reflection должен пройти. Другими словами, избавьтесь от вызова ass.GetTypes (), поскольку вам, очевидно, нужен только один единственный тип из сборки.

Кстати, доступ к первому элементу в массиве возвращаемых типов кажется рискованным, поскольку Reflection не гарантирует порядок, в котором возвращаются типы.

Вместо этого вы можете определить пользовательский атрибут уровня сборки, который указывает, какой тип, производный от BaseFacade, должен быть загружен.

2 голосов
/ 25 февраля 2010

Является ли медлительность LoadFrom из-за инициализации, происходящей в DLL, или это что-то в .NET Framework?

Это может помочь: http://dedjo.blogspot.com/2008/01/how-to-load-unmanaged-native-resources.html

2 голосов
/ 25 февраля 2010

Из вашего первого фрагмента видно, что вы загружаете библиотеки .NET через рефлексию. DllImport предназначен для загрузки неуправляемых библиотек, а не сборок .NET.

Без особых знаний об остальной части приложения трудно предложить какой-либо альтернативный метод тому, что вы уже делаете. Не могли бы вы первый фрагмент кода в фоновом потоке?

...