Pregunta

Estoy escribiendo una biblioteca de clases (IE BHO) en C # y actualmente estoy discutiendo con el gran volumen de lo que creo que es la salida de basura que proviene de las claves de registro generadas por REGASM.

La versión corta es esta: solo quiero exponer un puñado de clases (actualmente: UNA clase) a IE (y el resto de COM). Solo una clase tiene el conjunto de elementos ClassInterfaceAttribute y GUID, y puedo probar que el complemento solo requiere las claves de registro COM para esta clase y, sin embargo, REGASM genera GUID y claves de registro para cada clase en todo el proyecto.

Esto es molesto y algo inquietante, ya que no quiero que mis nombres de clase se encuentren en el registro de usuarios a menos que absolutamente tengan estar allí.

Para ser justos, muchas de esas otras clases están marcadas como públicas porque las uso en una aplicación de controlador de otro proyecto en la misma solución, para solucionar el agujero negro de depuración de IE ...

Todavía soy muy ecológico para COM en general (especialmente en relación con .Net) y me preguntaba cuál es la mejor manera de ocultar todas mis otras clases del regasmo. O, al menos, ¿por qué estas clases que, a pesar de que están marcadas como públicas, aparecen cuando no he establecido ninguna de las banderas COM para ellas?

¡Gracias!

¿Fue útil?

Solución

Use el modificador de acceso interno para cosas que no necesitan tener el modificador public . Para cosas que realmente necesitan acceso public , use el atributo ComVisible para ocultarlo parcialmente.

Por ejemplo:

[ComVisible(false)]
public class ClassToHide {
    //whatever
};

public class ClassToExpose {

     public void MethodToExpose() {}

     [ComVisible(false)]
     public void MethodToHide() {}
};

Todas las funciones miembro públicas y las variables miembro de todas las clases públicas son COM-visibles por defecto. Así que primero piense en hacerlos internos y si realmente los necesita en público, escóndelos de COM con ComVisible.

Otros consejos

Intente usar el modificador / regfile: esto generará un archivo reg en lugar de escribir directamente todos sus nombres de clase en el registro.

Cuando tenga el archivo .reg, puede eliminar las entradas que no desee agregar al registro de sistemas de destino e implementar solo esos valores en la máquina de destino. Dependiendo de cómo elija implementar su software, esto podría ser más fácil y no tendría que cambiar el código para ninguno de sus tipos.

De hecho, si no tiene acceso al código fuente, esta sería la única forma de lograrlo.

Escribí un componente COM con los mismos problemas.

Separé todas las funciones que no son COM en una DLL auxiliar separada. La DLL COM solo contiene el código que debe registrarse. Se accede a todo lo demás a través de la DLL auxiliar.

Descubrí que es una manera fácil de asegurarse de que el código futuro no se marque accidentalmente como public en lugar de internal y se muestre en el registro.

Establezca el atributo ComVisible en falso en el archivo AssemblyInfo y establezca aplicar ComVisible solo para las clases deseadas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top