Доступ к 32-битным DLL из 64-битного кода
Мне нужно перенести 32-битную DLL для использования в 64-битных C# (а также C++) приложениях. DLL пишется в неуправляемом коде Delphi. Я не могу перекомпилировать dll, и единственный способ - использовать межпроцессное взаимодействие (IPC). Я давно ищу, но не нашел много информации о. Лучшее руководство, которое я нашел, находится по этой ссылке: Доступ к 32-битным DLL из 64-битного кода.
Я следовал этому руководству для достижения своей цели, потому что очень часто цитируется на этом форуме. Поэтому руководство объясняет, что я должен сделать три шага:
1 ° ШАГ - Создайте 32-битный компонент, реализующий COM-объект, который загружает и вызывает 32-битную DLL и предоставляет 32-битный интерфейс DLL в качестве COM-интерфейса. Таким образом, я сделал то же самое, что объяснено здесь (пример взят из предыдущей ссылки):
[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGetMyString
{
string GetMyString();
}
[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")]
[ProgId("CallPDW.Class1")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IGetMyString
{
string GetMyString()
{
......
}
}
Затем мне нужно зарегистрировать сборку.NET COM, поэтому я должен использовать Regasm.exe, но вместо этого я создал проект установки и развертывания Visual Studio, который создает файл MSI и выполняет те же действия, что и Regasm. Затем я контролировал редактор реестра и нашел HKEY, чтобы он работал. Так что до этого шага все в порядке или вроде бы нормально.
2° ШАГ - Сконфигурируйте эти COM-компоненты для внепроцессного (ООП), либо создав стандартное приложение СОМ + ООП (используя dllhost в качестве суррогатного процесса);
3° ШАГ - Создайте 64-битную DLL-оболочку-оболочку, которая реализует тот же интерфейс, что и исходная 32-битная DLL, импортирует интерфейс COM созданного выше COM-объекта, преобразует текущие вызовы открытого интерфейса в вызовы интерфейса COM-объекта, передает параметры вызова, получает возвращаемые значения и делегирует их вызывающим;
Проблема в том, что 2° и 3° ШАГОВ я понятия не имею, как добиться, потому что я не нашел ничего в Интернете или на форуме об этом. Поэтому мне нужна помощь для достижения шага 2° и 3°. В порядке также некоторые ссылки на другие сообщения и т. Д. Заранее спасибо.
ПРОЧАЯ ИНФОРМАЦИЯ (10.12.2016 - 23:10): эта библиотека предоставляет свои функции 32-битной среде через два интерфейса: 1.) заголовок C/C++ с указателями на функции (WINAPI*) 2.).NET интерфейс с P/Invoke
1 ответ
Вы на правильном пути. Вы уже создали и зарегистрировали видимую COM-библиотеку DLL, которая необходима для предоставления методов вашей библиотеки Delphi.
Поскольку ваш процесс x64 не может вызвать эту оболочку x86, существует необходимость в суррогатном процессе. Однако не имеет смысла преобразовывать вашу DLL в полноценный COM+
сервер, если вы не собираетесь использовать какие-либо из его услуг.
Вместо этого я бы рекомендовал разместить вашу DLL-оболочку в стандартном суррогате COM. Для этого вызовите средство просмотра объектов OLE/COM на основе x86, которое является частью Windows SDK. Разверните узел "Все объекты" и выберите видимый класс COM. Оттуда перейдите на вкладку "Реализация" и установите флажок "Использовать суррогатный процесс". Перейдите на вкладку "Реестр" и убедитесь, что узел "AppID" теперь содержит [DllSurrogate]
запись. Примечание: если вам нужно автоматизировать этот шаг, вам нужно будет записать соответствующие значения в реестр самостоятельно, либо вручную, либо с помощью процедуры установки.
Теперь вы сможете создать экземпляр класса-оболочки COM в видимой области на вашем хосте x64.