2009-11-06 17 views
6

Tengo un ensamblado .NET que estoy exponiendo a COM. El conjunto tiene dos interfaces públicas y una clase pública. Cuando construyo el conjunto consigo esta advertencia:COM Registro de interoperabilidad

(assemblyName.dll) no contiene ningún tipo que se pueden registrar para interoperabilidad COM.

Mi información de ensamblado incluye la siguiente línea.

[assembly: ComVisible(true)] 

mayoría de las personas que tienen este problema en la web, que he encontrado, lo arreglaron con la línea anterior en su información de ensamblado. Esto no ha ayudado para mí.

También intenté agregar [ComVisible(true)] a las definiciones de clase y de interfaz, y tampoco me ayudó.

Respuesta

15

ComVisible generalmente necesita tener un constructor público predeterminado. Sus miembros normalmente también deben hacer referencia solo a los tipos ComVisible.

No necesita especificar ComVisible (verdadero) en la clase si lo ha especificado en el nivel de conjunto.

Sin embargo, la forma habitual para generar un conjunto con clases ComVisible es:

  • Especificar ComVisible (falso) en ensamblaje de nivel. Por lo tanto, solo las clases que están explícitamente marcadas con ComVisible (verdadero) están expuestas a COM.

  • definir una interfaz ComVisible explícito:

por ejemplo

[ 
ComVisible(true), 
GuidAttribute("..."), 
Description("...") 
] 
public interface IMyComVisibleType 
{ 
     // members... 
    } 
  • Su clase ComVisible debe especificar ClassInterfaceType.None, y debe implementar la interfaz ComVisible:

por ejemplo,

 [ 
    ComVisible(true), 
    GuidAttribute("..."), 
    ClassInterface(ClassInterfaceType.None) 
    ] 
    public sealed class MyComVisibleType : IMyComVisibleType 
    { 
     // implementation ... 
    } 

Tenga en cuenta que el GUID y atributos Descripción no son necesarios, pero útil para darle un mayor control de la generación COM.

Si lo anterior no funciona, intente publicar un código de muestra y estoy seguro de que alguien podrá ayudarlo.

+1

Olvidar agregar un constructor predeterminado me pasa algunas veces así que +1 para mencionarlo. –

+1

Agregar un constructor predeterminado público hizo el truco, sin embargo, la clase en cuestión solo se construye desde el código .net. Esta fue la razón por la que no se proporcionó ningún constructor predeterminado público. Supongo que esta advertencia también aparecerá para un ensamblaje que solo contenga interfaces. – trampster

+0

Sí, recibirá la misma advertencia para un ensamblaje con solo interfaces. Supongo que es similar a la forma en que una DLL VB6 ActiveX debe contener al menos una clase públicamente creado. Pero parece innecesariamente restrictivo en el mundo de .NET, ya que podría tener una clase construida por código administrado y pasarla a un componente COM, p. como un argumento de método. – Joe

0

Aquí están algunas otras cosas a cierto

  • Asegúrese de que los tipos que desea registrar están marcados como públicos
  • Añadir el atributo ComVisible(true) al tipo directamente, además del montaje de
  • Agregar el atributo Guid

No estoy seguro de si los dos últimos son estrictamente necesarios, pero los probaría.

+0

El GUID se genera en el tiempo de compilación en función del nombre completo de la clase y la identidad del conjunto que contiene la clase. es decir, no es necesario que hagas esto tú mismo. – trampster

+0

Probé el ComVisable (verdadero) en los tipos + comprobé dos veces que los tipos son públicos. Todavía sin suerte. – trampster

+0

¿Qué tal agregar un atributo GUID a cada clase expuesta? – Beached

0

creo que es necesario tener un ensamblado con nombre. ¿Firmas tu ensamblaje con un archivo de clave?

Además, también intente especificar: [Guid ("{GUID} recién generado")] [ClassInterface (ClassInterfaceType.AutoDual)]

clases
+0

no, no, pero no es necesario que tenga un nombre fuerte. Tengo otros ensamblados .NET que funcionan para com interop y no tienen nombre. – trampster

+0

Olvidé mencionar que también debe tener un constructor público predeterminado sin parámetros. – logicnp

2

Me encontré con el problema del constructor predeterminado. Lo que me engañó fue que el archivo de la biblioteca de tipos contendrá la referencia GUID de clase aunque esa clase no se esté registrando. Una forma rápida de ver qué va a ser registrado es crear un archivo de registro ('assembly.reg') así:

regasm assembly.dll /regfile:assembly.reg /codebase 

Hay una buena discusión de la exposición de las interfaces en COM Interop: Base class properties not exposed to COM. Algunos ejemplos de código están aquí: Exposing .NET Components to COM.

0

Tuve el mismo problema en un proyecto donde revisé la opción "Registrar para la interoperabilidad COM" para mi proyecto C#. Hay una solución fácil:

Mientras está en el Explorador de soluciones, vaya a la carpeta Propiedades. Abra el archivo AssemblyInfo.cs. Desplazarse hacia abajo a la línea que dice: [assembly: ComVisible(false)]

Cambiar esto a: [assembly: ComVisible(true)]

Esto eliminará los mensajes de advertencia, y permite el archivo .tlb que se cree, que a su vez permite que el código de .NET para la visibilidad COM .
Si no desea que todo el conjunto sea COM-visible, siga uno de los otros consejos anteriores.

Cuestiones relacionadas