2009-04-20 14 views
7

Actualmente estamos transfiriendo nuestros sitios web de Windows 2003 (32 bits) a Windows 2008 (64 bits) y hemos tenido un problema.wrap 32 bit dll para sistema operativo de 64 bits para trabajar con regsvr32.exe

Uno de nuestro sitio web utiliza la pasarela de pago HSBC CPI que requiere una DLL para registrarse (regsvr32.exe), esta DLL se utiliza luego dentro de un sitio web asp clásico. El problema es que la DLL es una DLL de 32 bits y por lo tanto no se registrará en el sistema operativo Windows 2008.

¿Hay alguna manera de envolver este dll de 32 bits en un proyecto C# .net para que sus métodos se expongan y se puedan registrar con el sistema operativo?

Cualquier ayuda sería muy apreciada.

Respuesta

5

Puede registrar la DLL con regsvr32.exe de la carpeta C: \ Windows \ SysWOW64.

Sin embargo, como no puede mezclar código de 64/32 bits, deberá crear un servicio C# ejecutando en x86 (consulte las propiedades del proyecto, destino de la plataforma) que puede usar desde su aplicación web x64 a través de WCF.

Una opción más fácil sería pedirle a HSBC una x64 dll.

+0

Gracias Chris esto funciona. Desafortunadamente HSBC no admite sistemas operativos de 64 bits. –

2

Nos topamos con los mismos problemas con la interfaz HSBC Cpi.

HSBC no proporciona un contenedor .Net, y el contenedor COM no se puede llamar desde una aplicación de 64 bits.

Esto hace que su implementación en un servidor 64 (que probablemente cubre el 25% de los servidores de producción nuevos) sea prácticamente imposible.

Observamos algunos de los enfoques enumerados, pero parecían mucho trabajo. Al final, después de un poco de tonterías, creamos con nuestra propia implementación, que se asemeja a esto.

Utiliza el siguiente código Java para obtener el hash intermedia

import java.io.Console; 
import java.lang.*; 
import java.util.*; 
import com.clearcommerce.CpiTools.security.HashGenerator; 
import com.clearcommerce.CpiTools.security.SecCrypto; 
import javax.xml.bind.annotation.adapters.HexBinaryAdapter; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.util.Vector; 
import javax.crypto.Mac; 
import javax.crypto.spec.SecretKeySpec; 

public class Extract { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     try 
     { 
      String encryptedKey = "<YOUR SECRET KEY HERE>"; 
      if (args.length == 1) 
       encryptedKey = args[0]; 

      HexBinaryAdapter hb = new HexBinaryAdapter(); 
      SecCrypto sc = new SecCrypto(); 

      byte abyte0[] = sc.decryptToBinary(encryptedKey); 
      System.out.println("New Secret Base64 Encoded : " + new String(Base64Coder.encode(abyte0))); 
      System.out.println("New Secret Hex Encoded : " + hb.marshal(abyte0)); 
      return; 
     } 
     catch(Exception ex) 
     { 
      System.out.println("Error:" + ex.getMessage()); 
     } 
    } 
} 

A continuación, utilice el siguiente código .NET para calcualte el hash

using System; 
using System.Collections.Generic; 
using System.Text; 

namespace HsbcIntergration 
{ 
    internal static class CpiHashing 
    { 
     <USE THE VALUE RETURNED FROM THE JAVA CODE HERE> 
     private static readonly byte[] _secret = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 

     public static string ComputeHash(List<string> inputList) 
     { 
      return ComputeHash(inputList, _secret); 
     } 

     public static string ComputeHash(List<string> inputList, byte[] secretData) 
     { 
      List<string> orderedDataToHash = new List<string>(inputList); 
      orderedDataToHash.Sort(StringComparer.Ordinal); 

      StringBuilder sb = new StringBuilder(); 
      foreach (string s in orderedDataToHash) 
       sb.Append(s); 

      List<byte> dataToHash = new List<byte>(); 
      dataToHash.AddRange(Encoding.ASCII.GetBytes(sb.ToString())); 
      dataToHash.AddRange(secretData); 

      System.Security.Cryptography.HMAC sha = System.Security.Cryptography.HMACSHA1.Create(); 
      sha.Key = secretData; 
      return Convert.ToBase64String(sha.ComputeHash(dataToHash.ToArray(), 0, dataToHash.Count)); 
     } 
    } 
} 
5

Si desea registrar la DLL COM de 32 bits creado utilizando VC++ o Visual Basic 6.0, entonces debe seguir los pasos a continuación sin realizar ningún cambio en el código. Tampoco requiere ninguna compilación y tampoco tiene que ejecutar IIS en modo WOW. Me he enfrentado a este problema hace unos años y resolví este problema y me funciona bien.

Escenario:

Déjame se supone que tiene una tercera parte COM DLL de 32 bits proporcionado por un proveedor. La DLL funciona bien en el sistema operativo de 32 bits y, en el momento en que te mueves a un entorno x64, no funciona aunque hayas intentado registrarlo a través de regsv32.

También déjenme asumir que el nombre de la DLL es "ASXUpload.DLL". Usaré este nombre en la solución que proporciono a continuación.

Solución

Por favor, siga los siguientes pasos:

  1. En primer lugar, si ya se ha registrado el archivo DLL en el sistema operativo de 64 bits anular el registro de la DLL. Para hacerlo, simplemente escriba lo siguiente en el comando de ejecución "regsvr32/u" algo así como "regsvr32/u C: \ MyDLL \ ASXUpload.DLL". Si ya ha anulado el registro del archivo DLL del sistema operativo x64, entonces no es necesario ejecutar este paso.

  2. También asegúrese de no haber guardado su DLL dentro de la carpeta de Windows que normalmente es C: \ Windows. Para este ejemplo, he mantenido el archivo DLL en la siguiente carpeta C: \ MyDLL.

  3. Ahora tenemos que agregar los componentes COM + utilizando los servicios de componentes de Microsoft. Para iniciar Servicios de componentes, vaya a Panel de control/Herramientas administrativas/Servicios de componentes. Una vez dentro de los Servicios del componente, vaya a Computadoras, luego a Mi PC, luego a Aplicaciones COM +. A continuación, haga clic con el botón derecho en Aplicaciones COM + y seleccione "Nuevo" -> "Aplicación".

  4. En la pantalla "Bienvenido al Asistente de instalación de la aplicación COM", haga clic en "Siguiente>".

  5. Haga clic en el botón "Crear una aplicación vacía".

  6. Introduzca el nombre. Dado que mi nombre de DLL es ASXUpload.dll, escribí el nombre como "ASXUpload". Cuando se le pregunte "Biblioteca o Servidor", seleccione "Servidor".

  7. Haga clic en el botón "Siguiente>" y luego seleccione "Este usuario".

  8. Ingrese el Usuario o haga clic en Examinar para seleccionar al usuario. Hacer clic en Buscar es más seguro, para garantizar que se usen el dominio y la ortografía correctos. Ingrese la contraseña y confirme la contraseña. Advertencia, asegúrese de incluir el dominio/nombre de usuario si es necesario. Haga clic en "Finalizar". (Nota: recomendamos "Este usuario", de lo contrario, alguien debe iniciar sesión en el servidor para que se ejecute DLL). En mi caso, he elegido la cuenta de administrador del dominio. También puede agregar una cuenta de servicio. Si no está seguro, consulte con el administrador del sistema.

  9. Ahora aparecerá la pantalla "Agregar funciones de aplicación". No agregue nada simplemente haga clic en el botón "Siguiente>".

  10. Ahora aparece la pantalla "Agregar usuarios a la función". No agregue nada simplemente haga clic en el botón "Siguiente>".

  11. Ahora verá que en Servicios de componentes -> Equipos -> Mi PC -> Aplicación COM + -> verá la aplicación recién agregada. En este ejemplo, el nombre de la aplicación sería "ASXUpload". Ahora desglosa la aplicación recién agregada "ASXUpload" haciendo clic en el ícono "+" y verás "Componentes".

  12. Ahora haga clic derecho en "Componentes" y luego seleccione "Nuevo componente". En la pantalla "Bienvenido al Asistente de instalación de la aplicación COM", haga clic en "Siguiente>".

  13. Haga clic en "Instalar componentes nuevos" y ahora seleccione la DLL que desea registrar. En el caso sería "C: \ MyDLL \ ASXUpload.DLL".

  14. Una vez que seleccione la DLL, verá que le mostrará los componentes encontrados. Haga clic en el botón "Siguiente>" para continuar y finalmente presione el botón "Finalizar" para completar.

  15. Ahora es la parte difícil. Haga clic derecho en la aplicación que ha agregado que encontrará en Servicios de componentes -> Equipos -> Mi PC -> Aplicación COM +. En mi caso, el nombre de la aplicación es "ASXUpload". Después de hacer clic derecho en la aplicación, seleccione "Propiedades". Se abrirá la ventana de propiedades de la aplicación. Haga clic en la pestaña "Seguridad". En la pestaña Seguridad, asegúrese de que en la sección "Autorización", la casilla de verificación "Aplicar controles de acceso para esta aplicación" esté desmarcada.

En la sección "Nivel de seguridad", seleccione el botón de opción "Realizar comprobaciones de acceso solo en el nivel de proceso. La propiedad de seguridad no se incluirá en el contexto del objeto. El contexto de llamada de seguridad COM + no estará disponible. "

Asegúrese de que la opción" Aplicar política de restricción "esté desmarcada.

Set “Suplantar nivel” a “Anónimo”

  1. Si desea acceder a la DLL de la aplicación web a continuación, asegúrese de que agrega el IUSR y IWAM cuenta. Para hacer esto, vaya a COM + Application -> Application Name (en este caso será ASXUpload) -> Roles -> CreateOwner -> Users. Haga clic con el botón derecho en Usuarios y agregue la cuenta IUSR e IWAM utilizada por el Servidor de información de Internet.

  2. También establezca el permiso NTFS en la carpeta donde guardó el archivo DLL. En este caso, he mantenido el archivo DLL dentro de la carpeta C: \ MyDLL. Ahora haga clic derecho en la carpeta "MyDLL" y vaya a la pestaña de seguridad y luego agregue la cuenta IUSR e IWAM.

Esto es todo lo que necesita hacer y debería ser capaz de consumir la DLL.

He usado esta técnica dos veces en dos organizaciones diferentes que he trabajado en el pasado en el entorno de producción y funciona sin problemas. Primero probé esto en el año 2005 y luego lo utilicé nuevamente en 2008.

Avíseme si se enfrenta a algún problema.

Cuestiones relacionadas