обернуть 32-битную DLL для 64-битной операционной системы для работы с regsvr32.exe - PullRequest
8 голосов
/ 20 апреля 2009

В настоящее время мы переносим наши веб-сайты с Windows 2003 (32-разрядная версия) на Windows 2008 (64-разрядная версия) и столкнулись с проблемой.

Один из наших веб-сайтов использует платежный шлюз HSBC CPI, для которого требуется регистрация DLL (regsvr32.exe), затем эта DLL-библиотека используется на классическом веб-сайте asp. Проблема заключается в том, что DLL является 32-разрядной библиотекой DLL, поэтому она не регистрируется в операционной системе Windows 2008.

Есть ли способ, которым мы можем обернуть эту 32-битную DLL в проекте c # .net, чтобы его методы были доступны и могли быть зарегистрированы в ОС?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

6 голосов
/ 11 сентября 2010

Если вы хотите зарегистрировать 32-битную COM-библиотеку, созданную с помощью VC ++ или Visual Basic 6.0, вам нужно выполнить следующие шаги, не внося никаких изменений в код. Это также не требует какой-либо компиляции, а также вам не нужно запускать IIS в режиме WOW. Я столкнулся с этой проблемой несколько лет назад, и я решил эту проблему, и она прекрасно работает для меня.

Сценарий:

Позвольте мне предположить, что у вас есть сторонняя 32-битная COM DLL, предоставленная поставщиком. DLL работает нормально на 32-битной операционной системе, и в момент перехода в среду x64 она не работает, даже если вы пытались зарегистрировать ее через regsv32.

Также позвольте мне предположить, что имя библиотеки DLL - "ASXUpload.DLL". Я буду использовать это имя в решении, которое я предоставляю ниже.

Решение

Пожалуйста, следуйте инструкциям ниже:

  1. Прежде всего, если вы уже зарегистрировали DLL в операционной системе x64, отмените регистрацию DLL. Для этого просто введите следующую команду «regsvr32 / u» что-то вроде «regsvr32 / u C: \ MyDLL \ ASXUpload.DLL». Если вы уже отменили регистрацию библиотеки DLL в ОС x64, запускать этот шаг не нужно.

  2. Также убедитесь, что вы не сохранили свою DLL в папке Windows, обычно это C: \ Windows. Для этого примера я сохранил DLL в следующей папке C: \ MyDLL.

  3. Теперь нам нужно добавить компоненты COM + с помощью служб компонентов Microsoft. Чтобы запустить службы компонентов, перейдите в Панель управления / Администрирование / Службы компонентов. Оказавшись в компонентных службах, перейдите в раздел «Компьютеры», затем «Мой компьютер», затем «Приложения COM +». Затем щелкните правой кнопкой мыши на приложениях COM + и выберите «Новое» -> «Приложение».

  4. На экране «Добро пожаловать в мастер установки приложения COM» нажмите «Далее>».

  5. Нажмите кнопку «Создать пустое приложение».

  6. Введите имя. Поскольку моя DLL-библиотека называется ASXUpload.dll, я набрал ее как «ASXUpload». На вопрос «Библиотека или сервер» выберите «Сервер».

  7. Нажмите кнопку «Далее>» и выберите «Этот пользователь».

  8. Введите пользователя или нажмите кнопку Обзор, чтобы выбрать пользователя. Нажатие Обзор безопаснее, чтобы убедиться, что используется правильный домен и орфография. Введите пароль и подтвердите пароль. Предупреждение, обязательно укажите домен / имя пользователя, если это необходимо. Нажмите «Готово». (Примечание. Мы рекомендуем «Этот пользователь», в противном случае для запуска DLL необходимо войти на сервер.). В моем случае я выбрал учетную запись администратора домена. Вы также можете добавить сервисную учетную запись. Если вы не уверены, обратитесь к системному администратору.

  9. Теперь появится экран «Добавить роли приложения». Не добавляйте ничего, просто нажмите кнопку «Далее>».

  10. Теперь появляется экран «Добавить пользователей в роль». Не добавляйте ничего, просто нажмите кнопку «Далее>».

  11. Теперь вы увидите, что в разделе Службы компонентов -> Компьютеры -> Мой компьютер -> Приложение COM + -> вы увидите только что добавленное приложение. В этом примере имя приложения будет «ASXUpload». Теперь разверните добавленное приложение «ASXUpload», нажав значок «+», и вы увидите «Компоненты».

  12. Теперь щелкните правой кнопкой мыши «Компоненты» и выберите «Новый компонент». На экране «Добро пожаловать в мастер установки приложения COM» нажмите «Далее>».

  13. Нажмите «Установить новый компонент (ы)» и теперь выберите DLL, которую вы хотите зарегистрировать. В этом случае это будет «C: \ MyDLL \ ASXUpload.DLL».

  14. Как только вы выберите DLL, вы увидите, что она покажет вам найденные компоненты. Нажмите кнопку «Далее>» для продолжения и, наконец, нажмите кнопку «Готово» для завершения.

  15. Теперь самое сложное. Щелкните правой кнопкой мыши на приложении, которое вы добавилиich вы найдете в разделе Службы компонентов -> Компьютеры -> Мой компьютер -> Приложение COM +. В моем случае имя приложения - «ASXUpload». После того, как вы щелкнете правой кнопкой мыши по Приложению, выберите «Свойства». Откроется окно свойств приложения. Нажмите на вкладку «Безопасность». На вкладке «Безопасность» убедитесь, что в разделе «Авторизация» флажок «Принудительно проверять доступ для этого приложения» снят.

В разделе «Уровень безопасности» установите переключатель «Выполнять проверки доступа только на уровне процесса». Свойство безопасности не будет включено в контекст объекта. Контекст вызова безопасности COM + будет недоступен. ”

Убедитесь, что опция «Применить политику ограничений» снята.

Установите для параметра «Олицетворение уровня» значение «Аноним»

  1. Если вы хотите получить доступ к DLL из веб-приложения, убедитесь, что вы добавили учетную запись IUSR и IWAM. Для этого перейдите в COM + Приложение -> Имя приложения (в данном случае это будет ASXUpload) -> Роли -> CreateOwner -> Пользователи. Щелкните правой кнопкой мыши на Пользователи и добавьте учетную запись IUSR и IWAM, используемую Информационным сервером Интернета.

  2. Также установите разрешение NTFS для папки, в которой вы хранили DLL. В этом случае я хранил DLL внутри папки C: \ MyDLL. Теперь щелкните правой кнопкой мыши папку «MyDLL» и перейдите на вкладку «Безопасность», а затем добавьте учетную запись IUSR и IWAM.

Это все, что вам нужно сделать, и вы сможете использовать DLL.

Я дважды использовал эту технику в двух разных организациях, в которых я работал в прошлом над производственной средой, и она работает без каких-либо проблем. Сначала я попробовал это в 2005 году, а затем снова использовал в 2008 году.

Дайте мне знать, если у вас возникнут какие-либо проблемы.

6 голосов
/ 20 апреля 2009

Вы можете зарегистрировать DLL с помощью regsvr32.exe из папки C: \ Windows \ SysWOW64.

Однако, поскольку вы не можете смешивать 64/32-битный код, вам придется создать службу C #, работающую в x86 (см. Свойства проекта, цель платформы), которую вы затем сможете использовать в своем веб-приложении x64 через WCF.

Более простой вариант - запросить HSBC для библиотеки x64.

2 голосов
/ 24 ноября 2009

Мы столкнулись с теми же проблемами с интерфейсом 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));
        }
    }
}
...