为64位操作系统包装32位dll以使用regsvr32.exe

时间:2009-04-20 13:48:59

标签: c# asp-classic dllregistration

我们目前正在将我们的网站从Windows 2003(32位)转移到Windows 2008(64位)并遇到问题。

我们的一个网站使用支付网关HSBC CPI,需要注册DLL(regsvr32.exe),然后在经典的asp网站内使用此DLL。问题是DLL是一个32位DLL,所以它不会注册到Windows 2008操作系统。

有没有办法可以将这个32位dll包装在一个c#.net项目中,这样它的方法就可以公开并可以在操作系统中注册了?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:6)

您可以使用c:\​​ Windows \ SysWOW64文件夹中的regsvr32.exe注册DLL。

但是,由于您无法混合使用64/32位代码,因此您必须创建一个在x86中运行的C#服务(请参阅项目属性,平台目标),然后您可以通过WCF从x64 Web应用程序中使用该服务。

更简单的选择是向汇丰银行询问x64 dll。

答案 1 :(得分:6)

答案 2 :(得分:2)

我们遇到了与HSBC Cpi界面相同的问题。

HSBC不提供.Net包装器和COM包装器 无法从64位应用程序调用。

这使得从64服务器上部署它(可能是 覆盖了25%的新生产服务器)实际上是不可能的。

我们查看了列出的一些方法,但它们看起来像 很多工作。最后我们有点搞乱了 提出了我们自己的实现,看起来像 此

使用以下Java代码获取中间哈希

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

然后使用以下.net代码计算哈希值

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