Cómo incluir libsodium.net en ASP.NET

Tengo un antiguo servicio web creado en archivos ASP.NET (usando .asmx). Necesito usar sodium.net: desafortunadamente falla al cargar el archivo libsodium.dll dependiente. ¿Alguna idea sobre lo que hago mal?

  • He añadido libsodium.net a través de NuGet.

  • He cambiado el nombre de la DLL de 64 bits a “libsodium.dll” (y también a otras convenciones de nombres).

  • He intentado hacer referencia a libsodium.dll directamente pero VS lo rechaza (no es una DLL válida). Así que lo he agregado como “contenido” en lugar de “copiar a salida”.

  • Después de comstackr, puedo ver que la carpeta del sitio web / Papelera contiene sodium.dll (el ensamblado .NET) y libsodium.net.

  • Cuando trato de usar libsodium.net obtengo:

    ERROR 2015-02-02 11: 14: 27,118 13798ms [41] CabinetService doRequest – Caught: El inicializador de tipo para ‘Sodium.SodiumCore’ lanzó una excepción. System.TypeInitializationException: el inicializador de tipo para ‘Sodium.SodiumCore’ lanzó una excepción. —> System.DllNotFoundException: no se puede cargar DLL ‘libsodium.dll’: no ​​se pudo encontrar el módulo especificado. (Excepción de HRESULT: 0x8007007E) en DynamicDllInvokeType.sodium_init () en Sodium.SodiumCore..cctor () — Fin de la acumulación de excepciones internas — en Sodium.SodiumCore.LibraryName () en Sodium.SecretBox.Create (Byte [] message, Byte [] nonce, Byte [] key) en Macaroons.SecretBoxCryptoAlgorithm.Encrypt (Byte [] key, Byte [] plainText) en c: \ Projects \ Macaroons.Net \ Macaroons.Net \ SecretBoxCryptoAlgorithm.cs: line 58

Por lo tanto, no puede encontrar “libsodium.dll” aunque esté en la carpeta Bin. También traté de eliminar la dependencia de “sodium.net”, donde después de obtener un error de tiempo de ejecución que dice “sodium.net” falta, cuando volví a agregarlo, ese error desapareció y obtuve el anterior (indicando el error). “sodium.net” carga correctamente).

Así que abro la carpeta de la sombra del sitio web en “C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Archivos temporales de ASP.NET \ cabinetservice” y busco “sodium”. El único resultado es “sodium.dll” en algunas subcarpetas. No hay “libsodium.dll”.

Aparentemente, ASP.NET ignora el archivo “libsodium.dll” al crear la instantánea del sitio web.

También he intentado agregar libsodium.dll (32 bits) a C: \ Windows \ System32 y libsodium.dll (64 bits) a C: \ Windows \ SysWOW64. Mismo resultado

Y he probado C: \ Windows \ Microsoft.NET \ assembly \ GAC_32 \ libsodium y C: \ Windows \ Microsoft.NET \ assembly \ GAC_64 \ libsodium. Mismo resultado

¿Cómo puedo hacer que ASP.NET sea consciente de la dependencia?

Resulta que ASP.NET no hace instantáneas de DLL no administradas como libsodium.dll y libsodium-64.dll.

Sodium.dll (el código administrado) intenta cargar las DLL desde el mismo directorio que la instantánea de Sodium.dll (que no va a funcionar), o en algún lugar de los directorios de la variable de entorno PATH.

Mi solución fue agregar el directorio AppDomain \ Bin a la ruta antes de llamar a cualquier código de Sodium:

// Make it possible to load unmanaged libsodium DLLs that .NET does not make shadow copies of. // -> Simply point the "path" variable to the Bin directory. string path = Environment.GetEnvironmentVariable("PATH"); string binDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Bin"); Environment.SetEnvironmentVariable("PATH", path + ";" + binDir); 

Actualización de enero de 2018 (de la respuesta de Jordan Rieger):

Tenga en cuenta que es posible que también deba instalar Microsoft Visual C ++ 2015 Redistributable en su servidor (ya sea el destino x64 o x86, según su proceso).

No olvide reiniciar su grupo de aplicaciones (hice un restablecimiento de IIS) después de instalar el redistribuible.

Tenga en cuenta que es posible que también deba instalar Microsoft Visual C ++ 2015 Redistributable en su servidor (ya sea el destino x64 o x86, según su proceso).

No olvide reiniciar su grupo de aplicaciones (hice un restablecimiento de IIS) después de instalar el redistribuible.

Ver mi comentario en https://stackoverflow.com/a/45078280/284704 .