2010-06-10 8 views
8

Mam program aktualizujący, ściągnięte pliki z serwera mieszały biblioteki dll vb6 i .net dll w jednym katalogu. jak ustalić, czy dll jest COM? (Tak więc mogę wywołać regsvr32 do niego z programu aktualizacyjnego)Jak ustalić, czy DLL to COM lub .NET?

+0

Dlaczego nie zrobić dobrze i zarejestrować te, które znasz, są serwerami COM i pomijać te, które nie są? Powinieneś mieć te informacje i możesz je zakodować w swoim instalatorze. – Tim

+0

@Tim - Wydaje mi się, że może istnieć sytuacja, w której wydawcy kodu nie są tą samą organizacją co konsumenci - w przeciwnym razie zgadzam się - wyraźnie kontrolują proces. –

+0

@AJ - to nadal nie znaczy, że nie można tego rozgryźć i przetestować. Chodzi mi o to, że jeśli jest to część procesu instalacji, powinieneś WIEDZIEĆ, co musi być zarejestrowane. Nie robienie tego jest niechlujne i nieprofesjonalne. Jest to prosty test, aby zrobić to wcześniej. Dlaczego chcesz dodać kod, gdy wszystko, co musisz zrobić, to wcześniej ustalić? – Tim

Odpowiedz

6

Myślę, że jednym ze sposobów, aby to zrobić, byłoby spróbować załadować plik z System.Reflection.Assembly.LoadFile(). Jeśli pojawi się wyjątek BadImageFormatException, nie jest to poprawny zestaw .NET. Prawdopodobnie jest to lepszy sposób, ale powinno to zadziałać.

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

+0

Wydaje się, że trzeba dużo pracy, aby napisać instalator, który robi to zamiast dokładnego śledzenia, które biblioteki DLL muszą zostać zarejestrowane. Ale +1 i tak – Tim

2

Dlaczego nie wystarczy zadzwonić regsvr na wszystkie z nich. Jeśli się zarejestrują, to ok, jeśli nie, to nic wielkiego.

Najprawdopodobniej najlepiej jest napisać instalator, który ma wiedzę na temat tego, który z nich jest właściwy i który jest odpowiedni dla każdego.

EDIT

Jeśli martwisz się o "emitujących błędów", nie denerwować.

See this usage

można stłumić wiadomości. (/ s)

+0

[@Hao] (http://stackoverflow.com/users/55327/hao) - pomimo mojej alternatywnej odpowiedzi, zgadzam się z Timem. –

+0

@AJ: problem z ślepo regsvring je, jeśli DLL jest typu .NET, regsvr32 emituje błąd – Hao

+1

http://support.microsoft.com/kb/249873 - użyj cichej flagi ... – Tim

5

Aby to zrobić, możesz sprawdzić PE, aby dowiedzieć się więcej na temat tego, jaki rodzaj materiałów eksportuje każdy dll. Jest a pretty interesting article on MSDN, który mówi o strukturze. Jeśli znasz konfigurację, możesz zidentyfikować łącza do .Net (a tym samym brak wskazujący czystą dll COM).

+0

Dziś skończyły się głosy. Wrócę i zagłosuję na to. To dobra techniczna odpowiedź. – Tim

+0

@ [Tim] (http://stackoverflow.com/users/26177/tim) - dziękuję :) To nie jest dla osób o słabym sercu, ale przy odrobinie wysiłku może zapewnić całkiem solidne rozwiązanie.Jeśli scenariusz jest czymś wyższym niż montaż, podejście to powinno być niezawodne (czytaj: nie zbyt wiele "zoptymalizowanych" PE do radzenia sobie). –