Как составить список используемых / неиспользуемых собственных библиотек из C #?

#c# #.net #dependencies #clr #pinvoke

#c# #.net #зависимости #clr #pinvoke

Вопрос:

У меня есть приложение .net (4.7.2), которое вызывает стороннюю собственную библиотеку с помощью [DllImport("Foo.dll"...)] . Этот собственный язык Foo.dll написан на C и имеет множество зависимостей: в настоящее время поставляется 90 сборок, 360 МБ (!). Я знаю, что некоторые зависимости поставляются, но больше не используются. Запрос этой третьей стороны на очистку не имел никакого эффекта, его становится все больше и больше каждые несколько месяцев.

Вопрос: Есть ли какой-либо способ отличить требуемые, активно загружаемые собственные сборки от раздувания dll?

Я экспериментировал с AppDomain.GetAssemblies() выходом из приложения, но он возвращает только управляемые сборки. Я экспериментировал с DependencyWalker и его современными зависимостями, но, похоже, большинство действительно необходимых зависимостей Foo.dll загружаются по требованию — в этих приложениях отображается лишь небольшая часть.

Комментарии:

1. Возможно, ProcessExplorer был бы полезен? Он должен иметь возможность отображать все библиотеки DLL, загруженные процессом.

2. Process Explorer не является хорошим вариантом. Поскольку DLL по определению загружаются динамически, вы рискуете столкнуться с пограничным случаем во время выполнения, что приведет к отсутствию библиотеки.

Ответ №1:

Вы могли бы использовать Procmon для отслеживания динамически загружаемых сборок.

Но если некоторые сборки загружаются только в том случае, если функция используется, то у вас нет другого выбора, кроме как просмотреть код (если вы можете) или просмотреть все возможные пути к коду и отслеживать все загруженные библиотеки DLL.