Как получить программный список всех загруженных сборок (на которые есть ссылки) в .NET Compact Framework - PullRequest
5 голосов
/ 02 июня 2009

Я работаю в Windows CE и использую Compact Framework. Мне нужно получить список всех ссылочных сборок, которые загрузило мое приложение. Было бы неплохо иметь возможность добраться до AssemblyName (объекта) этих сборок.

Пример похож на получение моей работающей сборки, выполнив: Assembly.GetExecutingAssembly (); за исключением того, что мне нужно получить ссылку на все другие загруженные сборки (сторонние Dlls).

Полная структура имеет метод Assembly.GetExecutingAssembly (). GetReferencedAssemblies () , но он недоступен в Compact Framework. Любая помощь будет оценена.

Ответы [ 2 ]

5 голосов
/ 02 июня 2009

На основании этого может показаться, что управляемые dll не являются действительно "загруженными" в том смысле, что они находятся в обычной структуре. Вместо этого IL сопоставляется с памятью, и JIT просто захватывает то, что ему нужно, по мере продвижения (без необходимости поддерживать загрузку памяти для кода, который был выполнен, но больше не используется)

Это объясняет, почему CF не позволяет перебирать загруженные библиотеки DLL. Что касается того, почему он не позволяет выполнять итерации по ссылочным dll , которые являются полностью компоновкой времени ...

Как возможное обходное решение:
Используйте GetExecutingAssembly , чтобы получить активный код. Убедитесь, что это происходит в вашем исполняемом файле, чтобы получить корневую сборку.

Напишите некоторый код, способный анализировать dll для манифеста, указывающий, на какие сборки ссылаются (это не обязательно должен быть управляемый код - API-интерфейс неуправляемого самоанализа, предоставляемый Microsoft, может даже сделать это для вас, а спецификация формата dll является общедоступной и маловероятной коренным образом измениться в ближайшее время). Я предлагаю черный список DLL, загруженных из GAC (хотя это может быть ненужным).

0 голосов
/ 02 июня 2009

Я думаю, если нет API для этого, вы можете попробовать это ...

Помните, это не очень хороший способ сделать это ...

  1. Найдите вызовы PInvoke в Windows CE и вызовите их, чтобы выяснить, какие библиотеки загружаются процессом.

  2. Затем итерируйте dll, чтобы проверить, есть ли у них заголовок CLI. Или вы можете просто попытаться загрузить dll как сборку, если она загружается, то это сборка .NET, загружаемая приложением.

Я знаю, что это неправильный способ сделать это, но это может сработать.

...