2010-06-10 3 views
8

Ho un programma di aggiornamento, i file estratti dal server hanno misto dll vb6 e .net dll in una directory. come determinare se una dll è una COM? (così posso invocare regsvr32 dal programma di aggiornamento)Come determinare se la DLL è COM o .NET?

+0

Perché non fare la cosa giusta e registrare quelli che conosci sono server COM e saltare quelli che non lo sono? Dovresti avere queste informazioni e puoi codificarle nel tuo programma di installazione. – Tim

+0

@Tim - Immagino che potrebbe esserci una situazione in cui gli editori del codice non sono la stessa organizzazione dei consumatori - altrimenti sono d'accordo - controllo il processo in modo esplicito. –

+0

@ AJ - che ancora non significa che non si possa capirlo e testarlo. Il mio punto è che se fa parte del processo di installazione, è necessario SAPERE ciò che deve essere registrato. Non farlo è sciatto e poco professionale. È un semplice test per farlo in anticipo. Perché vorresti aggiungere il codice quando tutto ciò che devi fare è determinarlo in anticipo? – Tim

risposta

6

Credo che un modo per farlo sarebbe provare a caricare il file con System.Reflection.Assembly.LoadFile(). Se ottieni una BadImageFormatException, non è un assembly .NET valido. Probabilmente c'è un modo più ordinato per farlo, ma dovrebbe funzionare.

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

+0

Sembra molto lavoro scrivere un programma di installazione che invece di monitorare con attenzione quali DLL devono essere registrate. Ma +1 in ogni caso – Tim

2

Perché non basta chiamare regsvr su ognuna di esse. Se si registrano allora ok, se non è un grosso problema.

Probabilmente è meglio scrivere un programma di installazione che abbia la conoscenza di quali sono e quali fanno la cosa giusta per ciascuno.

EDIT

Se siete preoccupati per "errori" che emettono, non preoccupatevi.

See this usage

È possibile sopprimere i messaggi. (/ s)

+0

[@Hao] (http://stackoverflow.com/users/55327/hao) - nonostante la mia risposta alternativa, sono d'accordo con Tim. –

+0

@AJ: il problema con regsvring ciecamente, se la DLL è di tipo .NET, il regsvr32 emette un errore – Hao

+1

http://support.microsoft.com/kb/249873 - usa la bandiera silenziosa ... – Tim

5

Per eseguire questa operazione, è possibile esaminare il PE per ottenere ulteriori informazioni sul tipo di materiale esportato da ciascuna DLL. C'è lo a pretty interesting article on MSDN che parla della struttura. Se capisci la configurazione, puoi identificare i collegamenti a .Net (e quindi la mancanza che indica una pura DLL COM).

+0

Oggi ho esaurito i voti. Tornerò e voterò questo. È una buona risposta tecnica. – Tim

+0

@ [Tim] (http://stackoverflow.com/users/26177/tim) - thanks :) Questo non è per i deboli di cuore, ma con un po 'di sforzo potrebbe fornire una soluzione piuttosto solida.Se lo scenario è qualcosa di più elevato rispetto all'assemblaggio, questo approccio dovrebbe essere affidabile (leggi: non troppi PE "ottimizzati" da trattare). –