2011-02-01 9 views
6

Se voglio rendere un assembly .NET utilizzabile come server COM, devo aggiungere una serie di attributi e quindi usare regasm per registrarlo come server COM.Perché esattamente il regramma mi avvisa della firma con un nome forte?

Se il gruppo non è firmato con un nome regasm quando eseguito con /codebase chiave mostra un RA0000 avviso dicendo che l'assemblea potrebbe interferire con altre assemblee sullo stesso computer e dovrei firmare con un nome sicuro, ma la registrazione ha successo e funziona anche bene.

I nomi sicuri AFAIK hanno lo scopo di impedire il cosiddetto inferno DLL. Ma COM aveva anche lo scopo di prevenire l'inferno della DLL. Se cambio qualsiasi interfaccia esposta a COM I deve modificare il GUID o almeno mantenere la compatibilità binaria. Quindi firmare con un nome forte non sembra aggiungere nulla di utile - nulla mi impedisce di rompere le interfacce COM, quindi firmare con la stessa coppia di chiavi e avere un inferno in piena regola.

A cosa serve firmare con un nome valido in caso di assembly .NET con esposizione COM?

risposta

7

È un avvertimento maldestro. Ci sono due aspetti dell'inferno DLL COM. La cosa veramente brutta è la modifica delle interfacce pubbliche e non l'assegnazione di nuovi GUID. Un'app client che non è stata ricompilata tende a bloccarsi e bruciare quando chiama un metodo o bombe completamente errati con una AccessViolationException sgradevole che non dà alcuna idea di quale possa essere la causa.

Il secondo sta facendo tutto correttamente (assegnando nuovi GUID) ma poi sovrascrive la DLL esistente con la nuova versione. Continuerai a bloccare l'app client stantio, ma più blandamente con un hreult E_NOINTERFACE che genera un'eccezione piuttosto specifica che ti aiuta a diagnosticare la causa. L'utente non è comunque più felice.

Che scenario ha una soluzione pronta nel .NET, GAC supporta la distribuzione side-by-side di assemblee con diversi numeri di versione in modo che sia il vecchio e la nuova versione può coesistere e il client App stantio continua essere felice con la vecchia versione. Che richiede un nome forte. Sì, quell'avvertimento poteva certamente essere stato soppresso quando si utilizza/codebase poiché ciò rende abbastanza chiaro che non si userà il GAC. Anche se non fa male a modificare leggermente il naso con l'uso di/codebase. Inoltre, non si utilizza mai il GAC sulla propria macchina di sviluppo durante il test, ma sicuramente lo si dovrebbe considerare durante la distribuzione.

1

La denominazione forte viene principalmente utilizzata per inserire le DLL nella GAC. In questo modo è possibile avere diverse versioni della Dll con lo stesso nome (!) Sullo stesso computer, che con le comuni DLL-COM spesso generava problemi. Non firmare la DLL rimuove la capacità di eseguire il GAC. Non hai problemi immediati a causa di ciò, ma non usi una funzionalità utile, quindi ricevi un avviso.

2

Per quanto ne so, COM non era destinato a prevenire l'inferno della DLL, era la fossa di Hades stesso. Il termine "Hell DLL" deriva dal problema di più librerie con metodi con lo stesso nome. La registrazione degli assembly COM nel registro di sistema non aiuta con la risoluzione in fase di esecuzione.

La firma di un assembly che ha lo scopo di fungere da server COM garantisce che l'assembly non entri in collisione con altri assembly registrati COM sullo stesso computer. Senza la firma, se due assembly registrati con COM avevano metodi con lo stesso nome, ciò potrebbe causare problemi.

Problemi correlati