Какой хороший способ заставить приложение на C ++ и WPF общаться

У меня есть C ++ dll, который является плагином для ADOBE Acrobat. Он должен часто разговаривать (туда и обратно) и с достаточным количеством сложных структур данных для процесса WPF.
Любые мысли о том, что может быть лучшим путем. Нужно что-то, что является немного долгосрочным и обслуживаемым, другими словами, хотелось бы, чтобы некоторые идеи были связаны с чем-то, что позволяло бы как процессу делать то, что выглядит как вызовы методов, так и некоторый элемент инфраструктуры, выполняющий маршалинг и диспетчеризацию. Я пробовал сообщения Windows, но столкнулся с некоторыми конфликтными проблемами на ADOBE, также не особо заинтересован во всем, что заставляет dll получить Adobe для загрузки CLR. Только другие вещи, которые приходят мне в голову, называются трубочками или http.
Заранее спасибо

0

Решение

Именованные каналы могут подойти, но у вас не будет ощущения просто вызова функций. Именованные каналы довольно низкого уровня IPC. Другие варианты IPC:

  • Windows RPC, вы определенно чувствуете, что просто вызываете функции.
  • Как насчет размещения COM-объекта в приложении WPF и вызова его из плагина Adobe?
1

Другие решения

Я бы пошел с COM:

  • Реализовать интерфейс в приложении WPF
  • создать библиотеку типов (например, с помощью regasm)
  • импортировать typelib в C ++ dll
  • общаться

если вам нужна двунаправленная связь, C ++ dll также может реализовать интерфейс COM, к которому затем можно получить доступ из приложения WPF.

Это то, что я использовал для соединения устаревшего приложения C ++ с новым сервисом .NET, и он прекрасно работает. Самая большая проблема — найти людей, которые знают COM, но, к счастью, это не требует глубокого понимания COM.

1

Ваш намек с 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.

0
По вопросам рекламы [email protected]