Мне нужно перенести 32-разрядную DLL, чтобы использовать ее в 64-битных C# (а также C++) приложениях. Dll записывается в неуправляемый код delphi. Я не могу перекомпилировать dll, и единственный способ - использовать межпроцессную связь (IPC). Я ищу много времени, но я нашел не много информации. Лучший справочник, который я нашел, находится по этой ссылке: Accessing 32-bit DLLs from 64-bit code.Доступ к 32-разрядным DLL-файлам из 64-разрядного кода
Я следил за этим руководством для достижения моей цели, потому что очень часто цитируется на этом форуме. Поэтому руководство объясняет, что я должен сделать три шага:
1 ° STEP - создать 32-разрядный компонент, реализующий объект COM, который загружает и вызывает в 32-разрядную DLL, и предоставляет 32-разрядный интерфейс DLL в качестве COM-интерфейс. Так что я сделал то же самое, как описано here (пример из предыдущей ссылки):
[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-компоненты для внепроцессного (ООП) путем создания стандартного приложения COM + OOP (с использованием dllhost в качестве суррогатного процесса);
3 ° ШАГА - Создание 64-битный обертка DLL, который реализует один и тот же интерфейс, как исходной 32-битной DLL, импортирует COM-интерфейс COM-объект, созданный выше, переводит текущие вызовы к воздействию интерфейса в вызовы на интерфейс COM-объекта, передает параметры вызова, получает возвращаемые значения и делегирует их вызывающим абонентам;
Проблема в том, что 2 ° и 3 ° ШАГИ я не знаю, как добиться, потому что я не нашел ничего в Интернете или на форуме об этом. Поэтому мне нужна помощь для достижения шага 2 ° и 3 °. Хорошо также некоторая ссылка на другие сообщения и т. Д. Заранее спасибо.
ДРУГИЕ ДАННЫЕ (12/10/2016 - 11:10 PM): Эта библиотека разоблачить свои функции в родной 32-битной среде через два интерфейса: 1.) C/C++ заголовок с указателями на функции (WINAPI *) 2.) интерфейс .NET с P/Invoke
HI @Aurora. Большое спасибо за ответ. Хорошо, это работает до тех пор, пока «... не войдет в запись [DllSurrogate]». – bob
Теперь я хочу автоматизировать это. У вас есть совет? Кроме того, я хотел бы также создать DLL-оболочку для класса видимости COM-класса, чтобы использовать непосредственно другую DLL для вызова функций на моем хосте x64. – bob
Вы запустили 'oleview' с полными правами администратора (Запуск от имени администратора)? Вам понадобятся соответствующие права для записи в реестр. Если вы хотите записать записи 'DllSurrogate' вручную, взгляните на [это] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms691260 (v = vs.85) .aspx) ссылка. Что касается вашей второй DLL: вы можете открыть функции 'P/Invoke' через вашу COM-видимую оболочку. Просто добавьте новый метод к вашему интерфейсу и классу, который вызывает соответствующую функцию. – Aurora