Arrastre y suelte una DLL al GAC (“ensamblado”) en el servidor de Windows 2008 .net 4.0

Intenté implementar algún código en una máquina cliente, donde no quiero instalar las herramientas de MS Windows SDK. Esto significa que no tiene acceso a “gacutil”. Tampoco he creado un instalador para mi código. Parece que estas podrían ser las únicas dos opciones en .net 4.0.

En el pasado simplemente iba a empezar, ejecutar, escribir “ensamblar” y arrastrar y soltar mi dll.

¿Esto ya no es posible? Cuando bash hacer esto, no aparece ningún mensaje de error, pero el archivo DLL no aparece en la carpeta “ensamblar”. Cuando uso gacutil en mi máquina dev funciona correctamente, pero el dll aún no aparece.

En .NET 4.0 Microsoft eliminó la capacidad de agregar archivos DLL al ensamblado simplemente arrastrando y soltando.

En su lugar, debe usar gacutil.exe o crear un instalador para hacerlo. Microsoft en realidad no recomienda el uso de gacutil, pero yo seguí esa ruta de todos modos.

Para usar gacutil en una máquina de desarrollo vaya a:
Start -> programs -> Microsoft Visual studio 2010 -> Visual Studio Tools -> Visual Studio Command Prompt (2010)

Luego use estos comandos para desinstalar y Reinstalar respectivamente. Tenga en cuenta que NO .dll en el comando de desinstalación.
gacutil /u myDLL
gacutil /i "C:\Program Files\Custom\myDLL.dll"

Para usar Gacutil en una máquina sin desarrollo, deberá copiar el archivo ejecutable y el archivo de configuración de su máquina de desarrollo a la máquina de producción. Parece que hay algunas versiones diferentes de Gacutil. El que funcionó para mí, encontré aquí:
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\NETFX 4.0 Tools\gacutil.exe.config

Copie los archivos aquí o en la carpeta .net correspondiente;
C:\Windows\Microsoft.NET\Framework\v4.0.30319

Luego use estos comandos para desinstalar y reinstalar respectivamente
"C:\Users\BHJeremy\Desktop\Installing to the Gac in .net 4.0\gacutil.exe" /u "myDLL"

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\gacutil.exe" /i "C:\Program Files\Custom\myDLL.dll"

En este caso, me incliné para copiar el archivo gacutil.exe, gacutil.exe.config Y TAMBIÉN el archivo gacutlrc.dll (del directorio 1033)

La utilidad gacutil no está disponible en las máquinas cliente, y la licencia Window SDK prohíbe redistribuirla entre sus clientes. Cuando su cliente no puede, no lo hará, (y realmente no debería) descargar el SDK de Windows de 300MB como parte del proceso de instalación de su aplicación.

Existe una API oficialmente compatible que usted (o su instalador) puede usar para registrar un ensamblaje en el caché de ensamblaje global. La tecnología Windows Installer de Microsoft sabe cómo llamar a esta API por usted. Debería consultar su utilidad de instalación de MSI (por ejemplo, WiX, InnoSetup) para obtener su propia syntax sobre cómo indicar que desea registrar un ensamblaje en la memoria caché de ensamblaje global.

Pero MSI y Gacutil no están haciendo nada especial. Simplemente llaman a la misma API a la que puede llamarse usted mismo. Para obtener documentación sobre cómo registrar un ensamblado a través del código, consulte:

KB317540: DOC: las API de Caché de ensamblados global (GAC) no están documentadas en la documentación del Kit de desarrollo de software .NET Framework (SDK)

 var IAssemblyCache assemblyCache; CreateAssemblyCache(ref assemblyCache, 0); String manifestPath = "D:\Program Files\Contoso\Frobber\Grob.dll"; FUSION_INSTALL_REFERENCE refData; refData.cbSize = SizeOf(refData); //The size of the structure in bytes refData.dwFlags = 0; //Reserved, must be zero refData.guidScheme = FUSION_REFCOUNT_FILEPATH_GUID; //The assembly is referenced by an application that is represented by a file in the file system. The szIdentifier field is the path to this file. refData.szIdentifier = "D:\Program Files\Contoso\Frobber\SuperGrob.exe"; //A unique string that identifies the application that installed the assembly refData.szNonCannonicalData = "Super cool grobber 9000"; //A string that is only understood by the entity that adds the reference. The GAC only stores this string //Add a new assembly to the GAC. //The assembly must be persisted in the file system and is copied to the GAC. assemblyCache.InstallAssembly( IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH, //The files of an existing assembly are overwritten regardless of their version number manifestPath, //A string pointing to the dynamic-linked library (DLL) that contains the assembly manifest. Other assembly files must reside in the same directory as the DLL that contains the assembly manifest. refData); 

Más documentación antes de que se elimine el artículo de KB:

Los campos de la estructura se definen de la siguiente manera:

  • cbSize : el tamaño de la estructura en bytes.
  • dwFlags – Reservado, debe ser cero.
  • guidScheme – La entidad que agrega la referencia.
  • szIdentifier : cadena única que identifica la aplicación que instaló el ensamblado.
  • szNonCannonicalData – Una cadena que solo entiende la entidad que agrega la referencia. El GAC solo almacena esta cadena.

Los valores posibles para el campo guidScheme pueden ser uno de los siguientes:

FUSION_REFCOUNT_MSI_GUID : una aplicación que se ha instalado utilizando Windows Installer hace referencia al ensamblaje. El campo szIdentifier está configurado en MSI , y szNonCannonicalData está configurado en Windows Installer. Este esquema solo debe ser utilizado por el instalador de Windows. FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID : una aplicación que aparece en Agregar o quitar progtwigs hace referencia al ensamblaje. El campo szIdentifier es el token que se utiliza para registrar la aplicación con Agregar o quitar progtwigs . FUSION_REFCOUNT_FILEPATH_GUID : una aplicación representada por un archivo en el sistema de archivos hace referencia al ensamblaje. El campo szIdentifier es la ruta a este archivo. FUSION_REFCOUNT_OPAQUE_STRING_GUID: una aplicación que solo está representada por una cadena opaca hace referencia al ensamblaje. El szIdentifier es esta cadena opaca. El GAC no realiza verificación de existencia de referencias opacas cuando elimina esto.

si tiene instalado .net framework necesario. Ex; .Net 4.0 o .Net 3.5 , entonces puede simplemente copiar Gacutil.exe desde cualquier máquina y hasta la máquina nueva.

1) Abra CMD como administrador en el nuevo servidor.
2) Atraviese la carpeta donde copió el Gacutil.exe. Por ejemplo, archivos de progtwigs C: \ (en mi caso).
3) Escriba lo siguiente en el indicador de cmd e instálelo.

C: \ Archivos de progtwig \ gacutil.exe / I dllname

Otras alternativas a un instalador y gacutil son las herramientas de GUI como Gac Manager o GACAdmin . O si te gusta PowerShell, podrías usar PowerShell GAC del cual yo soy el autor.

Tenga en cuenta que la API de Fusion no está administrada. La referencia actual está aquí: Guía de desarrollo> Referencia de la API no administrada> Fusion

Sin embargo, hay un método administrado para agregar un ensamblado a GAC: System.EnterpriseServices.Internal.Publish.GacInstall Y, si necesita registrar cualquier tipo: System.EnterpriseServices.Internal.Publish.RegisterAssembly

La referencia para la clase de publicación está aquí: .NET Framework Class Library> System.EnterpriseServices Namespaces> System.EnterpriseServices.Internal

Sin embargo, estos métodos fueron diseñados para instalar componentes requeridos por una aplicación de servicio web como ASP.NET o WCF. Como resultado, no registran los ensamblajes con Fusion; por lo tanto, pueden ser desinstalados por otras aplicaciones, o usando gacutil y hacer que su ensamblaje deje de funcionar. Por lo tanto, si los usa fuera de un servidor web donde un administrador administra el GAC, asegúrese de agregar una referencia a su aplicación en SOFTWARE \ Wow6432Node \ Microsoft \ Fusion \ References (para SO de 64 bits) o SOFTWARE \ Microsoft \ Fusion \ References (para sistema operativo de 32 bits) para que nadie pueda eliminar sus ensamblajes de soporte a menos que desinstalen su aplicación.

También puede copiar el archivo a GAC ​​usando un símbolo del sistema. Uso la siguiente secuencia de comandos por lotes para copiar la DLL y reiniciar IIS.

 copy /b/v/y "PathToAssembly\MyAssembly.dll" "C:\Windows\assembly\" iisreset /noforce pause 

Guarda la necesidad de usar o instalar gacutil