2010-09-13 23 views
60

¿Cuál es la diferencia real entre estas dos opciones? Lo que sé es:"Registrarse para COM Interop" frente a "Hacer visible el ensamblado COM"

Registrar para interoperabilidad COM
Esta opción ejecuta regasm en el montaje y registra la asamblea como un componente COM (o quizá no) en el registro con todas COM como entradas de registro. ¿Este paso genera un archivo TLB? ¿Qué más se hace?

A veces veo que se genera un tlb cuando compilo el proyecto pero a veces no, ¿por qué es esto?

Hacer COM asamblea visible
¿Qué efecto tiene sobre éste una asamblea? Si tengo el siguiente tipo dentro de este ensamblaje, ¿aún necesito especificar "Hacer visible el ensamblado COM" aunque mi tipo esté marcado como ComVisible?

[GuidAttribute("02810C22-3FF2-4fc2-A7FD-5E103446DEB0"), ComVisible(true)] 
public interface IMyInterface 
{ 
} 

Respuesta

90

"Haz COM asamblea visible" es un gran martillo para hacer todos los tipos públicos en el montaje [ComVisible]. Rara vez es deseable, debe seleccionar los tipos específicos que desea que sean visibles, como lo hizo en su fragmento.

Después de crear el ensamblado, debe registrarse para que un cliente COM pueda encontrarlo de nuevo. Que solo usa un número para identificar el objeto que quiere crear, el GUID, se necesita una búsqueda adicional para descubrir qué DLL lo implementa. El registro implica escribir claves en la parte HKLM\Software\Classes\CLSID\{guid} del registro. Puede hacerlo usted mismo ejecutando Regasm.exe /codebase /tlb o puede dejarlo en el sistema de compilación para hacerlo automáticamente después de construir el conjunto.

que es lo que hace "Registrarse para la interoperabilidad COM". Es deseable ya que garantiza que la copia anterior de la DLL se anule automáticamente antes de que se sobrescriba, lo que evita la contaminación del registro. VS necesita ejecutarse para tener acceso de escritura a esas claves de registro, una razón para hacerlo opcional. O simplemente no desea registrarlo, común en los servidores de compilación. No puedo comentar por qué a veces no obtendrías el .tlb sin más diagnósticos.

+1

+1. Supongo que una razón más de por qué es opcional es que no siempre es necesario registrar el ensamblado en su servidor de compilación diario. Por ejemplo, expone un ensamblado de C# a COM y lo consume desde C++ a través de la directiva '# import', que está contento de usar el archivo .tlb. – sharptooth

+0

+1: Creo que con "todos los tipos en ensamblaje [ComVisible]" quiere decir * todos los tipos públicos * porque los tipos públicos son los que veo en el TLB exportado. – A9S6

+0

Gracias, los comentarios se combinaron en la respuesta. –

Cuestiones relacionadas