2010-06-10 4 views
8

У меня есть программа обновления, вытащенные файлы с сервера имеют смешанную dll vb6 и .net dll в одном каталоге. как определить, является ли DLL COM? (так что я могу вызвать regsvr32 к нему из программы обновления)Как определить, является ли DLL COM или .NET?

+0

Почему бы вам не сделать правильные вещи и не зарегистрировать те, которые, как вы знаете, являются серверами COM, и пропустить те, которые нет? У вас должна быть эта информация, и вы можете ее закодировать в своем установщике. – Tim

+0

@Tim - Я предполагаю, что может существовать ситуация, когда издатели кода не являются той же организацией, что и потребители, иначе я согласен - явным образом контролирую процесс. –

+0

@ AJ - это все еще не означает, что вы не можете понять это и проверить. Я хочу сказать, что если это часть процесса установки, вы должны ЗНАТЬ, что нужно зарегистрировать. Не делать этого небрежно и непрофессионально. Это простой тест, чтобы сделать это заранее. Почему вы хотите добавить код, когда все, что вам нужно сделать, определить заранее? – Tim

ответ

6

Я предполагаю, что один из способов сделать это - попробовать загрузить файл с помощью System.Reflection.Assembly.LoadFile(). Если вы получаете исключение BadImageFormatException, это не допустимая сборка .NET. Вероятно, есть более простой способ сделать это, но это должно сработать.

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

+0

Кажется, что большая работа заключается в том, чтобы написать установщик, который делает это, а не тщательно отслеживать, какие DLL должны быть зарегистрированы. Но +1 в любом случае – Tim

2

Почему бы просто не назвать REGSVR на всех из них. Если они регистрируются, тогда это нормально, если не будет большой сделки.

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

EDIT

Если вы беспокоитесь о "излучающих ошибках", не волнуйтесь.

See this usage

Вы можете подавить сообщения. (/ s)

+0

[@Hao] (http://stackoverflow.com/users/55327/hao) - несмотря на мой альтернативный ответ, я согласен с Тимом. –

+0

@AJ: проблема со слепое regsvring их, если DLL имеет тип .NET, regsvr32 испускает ошибку – Hao

+1

http://support.microsoft.com/kb/249873 - использовать флаг молчания ... – Tim

5

Чтобы сделать это официально, вы можете проверить PE, чтобы узнать больше о том, какие типы материалов каждая dll экспортирует. Существует a pretty interesting article on MSDN, который рассказывает о структуре. Если вы понимаете настройку, вы можете идентифицировать ссылки на .Net (и, следовательно, недостаток, указывающий чистую COM-библиотеку).

+0

Сегодня у меня кончились голоса. Я вернусь и проголосую за это. Это хороший технический ответ. – Tim

+0

@ [Tim] (http://stackoverflow.com/users/26177/tim) - спасибо :) Это не для слабонервных, но с небольшим усилием оно может обеспечить довольно прочное решение.Если сценарий является чем-то более высоким, чем сборка, этот подход должен быть надежным (читайте: не слишком много «оптимизированных» PE для решения). –

Смежные вопросы