У меня есть C ++ dll, который является плагином для ADOBE Acrobat. Он должен часто разговаривать (туда и обратно) и с достаточным количеством сложных структур данных для процесса WPF.
Любые мысли о том, что может быть лучшим путем. Нужно что-то, что является немного долгосрочным и обслуживаемым, другими словами, хотелось бы, чтобы некоторые идеи были связаны с чем-то, что позволяло бы как процессу делать то, что выглядит как вызовы методов, так и некоторый элемент инфраструктуры, выполняющий маршалинг и диспетчеризацию. Я пробовал сообщения Windows, но столкнулся с некоторыми конфликтными проблемами на ADOBE, также не особо заинтересован во всем, что заставляет dll получить Adobe для загрузки CLR. Только другие вещи, которые приходят мне в голову, называются трубочками или http.
Заранее спасибо
Именованные каналы могут подойти, но у вас не будет ощущения просто вызова функций. Именованные каналы довольно низкого уровня IPC. Другие варианты IPC:
Я бы пошел с COM:
regasm
)если вам нужна двунаправленная связь, C ++ dll также может реализовать интерфейс COM, к которому затем можно получить доступ из приложения WPF.
Это то, что я использовал для соединения устаревшего приложения C ++ с новым сервисом .NET, и он прекрасно работает. Самая большая проблема — найти людей, которые знают COM, но, к счастью, это не требует глубокого понимания COM.
Ваш намек с COM очень интересен. Я пытался реализовать эту концепцию.
Я создал интерфейс в своем проекте WPF CallDllFromWpf3Interface:
using System.Runtime.InteropServices;
namespace CallDllFromWpf3Interface
{
[Guid("F6E0E2E8-CCC6-487B-8BF1-261265061E6A")]
public interface SetValueInterface
{
void SetValue(int value);
}
}
Затем я сгенерировал typelib с помощью инструмента regasm:
regasm CallDllFromWpf3Interface.exe / tlb
С помощью инструмента «oleview» я могу видеть библиотеку типов и интерфейс.
Следующим шагом было создание dll-проекта на языке c ++ под названием «CallSetValueInterface».
В моем файле CallSetValueInterface.cpp я написал следующие строки:
#import "D:\Thomas\Programming\WPF\Basics\CallDllFromWpf\CallDllFromWpf3Interface\CallDllFromWpf3Interface\bin\Debug\CallDllFromWpf3Interface.tlb"
void
CallSetValueInterface::startAcq(void)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CallDllFromWpf3Interface::SetValueInterfacePtr Svip("f6e0e2e8-ccc6-487b-8bf1-261265061e6a");
Svip->SetValue(55);
Svip = NULL;
CoUninitialize();
}
После успешной сборки проекта dll я скопировал «CallSetValueInterface.dll» в проект «CallDllFromWpf3Interface».
Наконец я изменил свой код WPF на:
#region SetValueInterface Members
public void SetValue(int value)
{
MyValue = value;
}
#endregion
[DllImport("CallSetValueInterface.dll", EntryPoint = "startAcq", ExactSpelling = true, SetLastError = true)]
public static extern void StartAcqFromDll();
private void Button_Click(object sender, RoutedEventArgs e)
{
StartAcqFromDll();
}
И когда отладчик пришел к StartAcqFromDll (), появилось диалоговое окно с сообщением об ошибке «Необработанное исключение типа« System.Runtime.InteropServices.SEHException »произошло в CallDllFromWpf3Interface.exe».
Кто-нибудь знает, что происходит не так?
С Уважением,
ThomasL.