2009-04-20 8 views
7

Attualmente stiamo trasferendo i nostri siti Web da Windows 2003 (32 bit) a Windows 2008 (64 bit) e abbiamo riscontrato un problema.wrap 32 bit dll per sistema operativo a 64 bit per funzionare con regsvr32.exe

Uno dei nostri siti Web utilizza il gateway di pagamento HSBC CPI che richiede la registrazione di una DLL (regsvr32.exe), quindi questa DLL viene utilizzata all'interno di un sito Web asp classico. Il problema è che la DLL è una DLL a 32 bit e quindi non verrà registrata con il sistema operativo Windows 2008.

C'è un modo per racchiudere questa dll a 32 bit in un progetto C# .net in modo che i metodi siano esposti e possano essere registrati con il sistema operativo?

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

5

È possibile registrare la DLL con regsvr32.exe dalla cartella C: \ Windows \ SysWOW64.

Tuttavia, poiché non è possibile combinare codice a 64/32 bit, è necessario creare un servizio C# in esecuzione in x86 (vedere le proprietà del progetto, target della piattaforma) che è possibile utilizzare dall'app Web x64 tramite WCF.

Un'opzione più semplice sarebbe chiedere a HSBC una dll x64.

+0

Grazie chris questo funziona. Purtroppo HSBC non supporta i sistemi operativi a 64 bit. –

2

Abbiamo riscontrato gli stessi problemi con l'interfaccia HSBC Cpi.

HSBC non fornisce un wrapper .Net e il wrapper COM non può essere chiamato da un'app 64 bit.

Ciò rende praticamente impossibile l'implementazione su un server 64 (che probabilmente è lo copre il 25% dei nuovi server di produzione).

Abbiamo esaminato alcuni degli approcci elencati, ma sembravano molto lavoro . Alla fine, dopo un po 'di confusione, abbiamo creato la nostra implementazione, che è simile a .

Utilizzare il seguente codice Java per ottenere l'hash intermedio

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()); 
     } 
    } 
} 

Quindi utilizzare il seguente codice .NET per calcualte l'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

Se si desidera registrare il COM DLL a 32 bit creato utilizzando VC++ o Visual Basic 6.0, quindi è necessario seguire i passaggi seguenti senza apportare modifiche al codice. Inoltre, non richiede alcuna compilazione e inoltre non è necessario eseguire IIS in modalità WOW. Ho affrontato questo problema alcuni anni fa e ho risolto questo problema e funziona bene per me.

Scenario:

Permettetemi di supporre che si dispone di un 3rd party a 32 bit DLL COM fornito da un fornitore. La DLL funziona bene sul sistema operativo a 32 bit e nel momento in cui ti sposti in un ambiente x64 non funziona anche se hai provato a registrarlo tramite regsv32.

Supponiamo inoltre che il nome della DLL sia "ASXUpload.DLL". Userò questo nome nella soluzione che sto fornendo di seguito.

Soluzione

Si prega di seguire le istruzioni riportate di seguito:

  1. Prima di tutto se si è già registrato la DLL in x64 del sistema operativo del annullare la registrazione della DLL. Per farlo basta digitare il comando seguente "regsvr32/u" come "regsvr32/u C: \ MyDLL \ ASXUpload.DLL". Se si è già registrata la DLL dal sistema operativo x64, non è necessario eseguire questo passaggio.

  2. Assicurarsi inoltre di non aver conservato la DLL all'interno della cartella Windows che normalmente è C: \ Windows. Per questo esempio ho mantenuto la DLL nella seguente cartella C: \ MyDLL.

  3. Ora è necessario aggiungere i componenti COM + utilizzando Servizi componenti di Microsoft. Per avviare Servizi componenti, andare su Pannello di controllo/Strumenti di amministrazione/Servizi componenti. Una volta all'interno di Servizi componenti, eseguire il drill down su Computer, quindi su Risorse del computer, quindi su Applicazioni COM +. Quindi fare clic con il tasto destro del mouse su Applicazioni COM + e selezionare "Nuovo" -> "Applicazione".

  4. Nella schermata "Benvenuti alla procedura guidata di installazione dell'applicazione COM", fare clic su "Avanti>".

  5. Fare clic sul pulsante "Crea un'applicazione vuota".

  6. Inserire il nome. Dal momento che il mio nome DLL è ASXUpload.dll quindi ho digitato il nome come "ASXUpload". Alla richiesta "Libreria o Server", selezionare "Server".

  7. Fare clic sul pulsante "Avanti>", quindi selezionare "Questo utente".

  8. Immettere l'utente o fare clic su Sfoglia per selezionare l'utente. Fare clic su Sfoglia è più sicuro, per garantire che vengano utilizzati il ​​dominio e l'ortografia corretti. Inserire la password e confermare la password. Attenzione, assicurati di includere il dominio/nome utente se necessario. Clicca su "Fine". (Nota: Raccomandiamo "Questo utente", altrimenti, qualcuno deve essere registrato sul server per poter eseguire la DLL.). Nel mio caso ho scelto l'account dell'amministratore del dominio. Puoi anche aggiungere un account di servizio. In caso di dubbi, consultare l'amministratore di sistema.

  9. Ora verrà visualizzata la schermata "Aggiungi ruoli applicazione". Non aggiungere nulla, basta fare clic sul pulsante "Avanti>".

  10. Ora viene visualizzata la schermata "Aggiungi utenti al ruolo". Non aggiungere nulla, basta fare clic sul pulsante "Avanti>".

  11. Ora lo vedrete in Servizi componenti -> Computer -> Risorse del computer -> Applicazione COM + -> vedrete l'applicazione appena aggiunta. In questo esempio il nome dell'applicazione sarà "ASXUpload". Ora esegui il drill down dell'applicazione "ASXUpload" appena aggiunta facendo clic sull'icona "+" e vedrai "Componenti".

  12. Ora fare clic destro su "Componenti" e quindi scegliere "Nuovo componente". Alla schermata "Benvenuti nella procedura guidata di installazione dell'applicazione COM", fare clic su "Avanti>".

  13. Fare clic su "Installa nuovi componenti" e ora selezionare la DLL che si desidera registrare. Nel caso sarebbe "C: \ MyDLL \ ASXUpload.DLL".

  14. Una volta selezionata la DLL, vedrete che vi mostrerà i componenti trovati. Fare clic sul pulsante "Avanti>" per procedere e infine premere il pulsante "Fine" per completare.

  15. Ora è la parte difficile. Fai clic con il tasto destro del mouse sull'applicazione che hai aggiunto, che troverai in Servizi componenti -> Computer -> Risorse del computer -> Applicazione COM +. Nel mio caso il nome dell'applicazione è "ASXUpload". Dopo aver fatto clic destro sull'applicazione selezionare "Proprietà". La finestra delle proprietà dell'applicazione si aprirà. Clicca sulla scheda "Sicurezza". Nella scheda Sicurezza, assicurati che nella sezione "Autorizzazione" la casella "Applica controlli di accesso per questa applicazione" sia deselezionata.

Nella sezione "Livello di sicurezza" selezionare il pulsante di opzione "Esegui verifiche di accesso solo a livello di processo. La proprietà di sicurezza non sarà inclusa nel contesto dell'oggetto. Il contesto di chiamata di sicurezza COM + non sarà disponibile. "

Assicurarsi che l'opzione" Applica criterio di restrizione "sia deselezionata.

Impostare “Livello Rappresenta” per “Anonimo”

  1. Se si desidera accedere alla DLL da Web Application quindi assicurarsi che si aggiunge l'IUSR e IWAM. Per farlo vai su COM + Applicazione -> Nome applicazione (in questo caso sarà ASXUpload) -> Ruoli -> Crea proprietario -> Utenti. Fare clic con il pulsante destro del mouse su Utenti e aggiungere l'account IUSR e IWAM utilizzato da Internet Information Server.

  2. Impostare inoltre l'autorizzazione NTFS nella cartella in cui è stata conservata la DLL. In questo caso ho mantenuto la DLL all'interno della cartella C: \ MyDLL. Ora fai clic destro sulla cartella "MyDLL" e vai alla scheda sicurezza e aggiungi l'account IUSR e IWAM.

Questo è tutto ciò che dovete fare e dovreste essere in grado di consumare la DLL.

Ho usato questa tecnica due volte in due diverse organizzazioni che ho lavorato in passato nell'ambiente di produzione e funziona senza problemi. Per prima cosa ho provato questo nel 2005 e poi l'ho usato di nuovo nel 2008.

Fatemi sapere se si riscontrano problemi.