14 de mayo de 2016

Registrar un control ActiveX .NET

Artículo original: Registering the .NET ActiveX Control
http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,df3f1be8-62bc-491c-935e-570ebfe53164.aspx
Autor: Craig Boyd
Traducido por: Ana María Bisbé York


Problemas con el registro

He recibido algunos comentarios y un par de mensajes referidos a cómo registrar adecuadamente el ActiveX Menustrip/Toolstrip (http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,3dd24f92-a52c-4bb0-8121-c2e6e2cc4f93.aspx). El problema es que incluso después de registrar el control con RegAsm, el desarrollador obtiene un error sobre que el control no se ha registrado, o un error de que un archivo especificado no se ha encontrado. El segundo de estos mensajes es más cercano a la verdad, ya que el problema es que incluso, aunque se ha registrado el control el sistema, no puede encontrado el ensamblado. Existen varias formas en las que se puede arreglar esto, algunas mejores que otras.

Primera forma (definitivamente una mala idea)

La primera forma  para hacerlo es colocarlo en la Global Assembly Cache (GAC) (http://www.codeproject.com/dotnet/DemystifyGAC.asp) que tiene dos problemas: es una mala idea estar mezclando su GAC o la de sus usuarios con un ensamblado casero y como el original que he liberado para descarga no está firmado con un nombre estricto, no funcionaría.

Segunda forma (probablemente una mala idea)

La segunda forma de hacerlo es utilizar el parámetro /codebase con regasm.exe. Para encontrar qué es el parámetro /codebase debe leer sobre el en Assembly Registration Tool (http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfassemblyregistrationtoolregasmexe.asp).

El comando básico que realiza esto en la línea de comandos es:

regasm /codebase dotnetcontrol.dll

Justo en este caso de que usted no sepa, debe incluir toda la ruta tanto para regasm y dotnetcontrol.dll en el comando arriba. Entonces, para usted debe ser algo como esto:

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe /codebase C:\DotNetControl\DotNetControl.dll

El problema con este procedimiento es que debido a que el ensamblado (dotnetcontrol.dll) no está firmado con nombre estricto, va a recibir el siguiente mensaje, que da miedo, cuando ejecuta el ensamblador con el parámetro /codebase

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can ca
use your assembly to interfere with other applications that may be installed on
the same computer. The /codebase switch is intended to be used only with signed
assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully

Ahora, yo personalmente pienso que el mensaje de aviso es un poco exagerado; pero si ellos dicen que el parámetro /codebase puede ser utilizado sólo para ensambladores con nombre estricto, entonces permítanme moverme hacia la tercera forma de hacerlo.

Tercera forma

Descargar el ensamblador que he regenerado. (http://www.sweetpotatosoftware.com/files/dotnetcontrol_strongname.zip) Está firmado con un nombre estricto así que puede utilizar el parámetro /codebase sin recibir ese mensaje aterrorizante. Si ya ha registrado alguno de mis entradas anteriores, entonces deshaga el registro. Entonces, registre este nuevo ensamblador utilizando los mismos pasos que di en la segunda forma, antes mostrada.

Cómo firmar un ensamblado con nombre estricto

Para aquellos que están trabajando en un proyecto C# y quieran saber cómo firmar su ensamblado con un nombre estricto, puede leer sobre esto en Signing an Assembly with a Strong Name (http://msdn.microsoft.com/library/en-us/cpguide/html/cpconassigningassemblystrongname.asp) Básicamente, la forma más sencilla es utilizar sn.exe (viene dentro del SDK) para crear un archivo clave de nombre estricto (.SNK). Entonces, coloque este archivo clave de nombre estricto en cualquier lugar de su proyecto. Finalmente, abra el archivo AssemblyInfo.cs en su proyecto y coloque la siguiente línea en el final (va a necesitar, o toda la ruta, o la ruta relativa del archivo clave dentro de las comillas):

[assembly:AssemblyKeyFileAttribute(@"sgKey.snk")] 

Puede regenerar su ensamblado y firmarlo con nombre estricto.

Compartiendo ideas

Al crear controles o ejemplos con .NET, ya sea un FLL, un control ActiveX, o cualquiera, vale la pena asignar los pasos para la instalación adecuada de runtimes o registros de control. Haber empleado unos minutos extras de mi parte, podrían haber ahorrado parte de su valioso tiempo. Pido disculpas y pienso que esta vez he aprendido mi lección. Muchas gracias a Bernard Bout y Gary Williams por ser los dos primeros desarrolladores en llamar mi atención sobre estos aspectos.

No hay comentarios. :

Publicar un comentario