Читайте сборку Guid без блокировки DLL в домене приложения со средним доверием ASP.Net - PullRequest
3 голосов
/ 27 мая 2010

Можно ли прочитать GUID из сборки без фактической загрузки его в текущий домен приложения

Обычно Assembly.Load загружает DLL в домен приложения. Я просто хочу прочитать значение.

Описание GUID:

'The following GUID is for the ID of the typelib 
' if this project is exposed to COM
<Assembly: Guid("DEDDE61CD-928E-4ACD-8C25-3B8577284819")> 

Главное main - я не хочу блокировать файл, чтобы не было ошибок.

Ответы [ 4 ]

6 голосов
/ 04 июня 2010

Если вы загрузите сборку, используя Assembly.ReflectionOnlyLoad (byte []) , она загрузит ее как тень и не заблокирует файл.

var bytes = File.ReadAllBytes(path);
var assembly = Assembly.ReflectionOnlyLoad(bytes);

Обычно такие инструменты, как Reflector, получают доступ к узлам, не блокируя их.

1 голос
/ 02 июня 2010

Поскольку блокировка - это ваша проблема, вы можете получить то, что хотите, используя другой домен приложений с Теневое копирование с включенным (это та же функциональность, которую ASP.NET использует для разблокировки файлов) при загрузке файлы. Это не блокирует оригинальный файл.

Кроме этого, существует перегрузка Assembly.Load (), которая занимает байт [] , так что вы можете сначала загрузить данные в память, а затем загрузить сборку из памяти. Хотя я не пробовал этого, так что я не знаю, этот альтернативный подход действительно работает.

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

Я предлагаю вам сначала создать отдельную AppDomain ( AppDomain.CreateDomain () ), затем загрузить файл Assembly в байтовый массив, вызвать AppDomain.Load () , который принимает массив байтов, извлекает Guid и, наконец, использует AppDomain.Unload () для выгрузки созданного AppDomain.

Это сохранит вашу память в чистоте, код сборки отделен от основного кода приложения и, конечно, файл Assembly не будет заблокирован. Конечно, вы должны использовать какой-то кэш, чтобы не загружать один и тот же файл несколько раз. Файловые операции и вызовы отражения довольно дороги (с точки зрения времени выполнения).

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

Каждая сборка .NET представляет собой PE (исполняемый файл) файл. Его внутренний формат задокументирован. Если внутри находится каталог IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR, который указывает на структуру IMAGE_COR20_HEADER, которая имеет ссылку на раздел MetaData, который имеет поля Streams и StreamHeaders. Вы должны найти в StreamHeaders позицию потока с именем #GUID и прочитать его из Streams соответствующего блока данных. Если вы откроете для IL Disassembler ildasm.exe (средство Windows SDK) DLL-библиотеку .NET и ее заголовки (см. Меню «Вид и заголовки»), вы увидите структуру паров.

Вы можете прочитать дополнительную информацию в http://msdn.microsoft.com/en-us/magazine/cc301808.aspx и http://www.ntcore.com/files/dotnetformat.htm#MetaSection и http://www.visualcplusdotnet.com/visualcplusdotnet5a.html (от автора "Explorer Suite", который можно скачать с http://ntcore.com/exsuite.php).

Можно также рассмотреть способ использования IID_IMetaDataDispenser для чтения информации о метаданных из сборки. См. http://www.remotesoft.com/salamander/obfuscator/MyApp/MyPrivateLib.cpp.txt или «Meta» пример из http://www.wheaty.net/downloads.htm

...