Существуют ли библиотеки для межпроцессного взаимодействия (IPC) между .NET-приложением и собственным C++-приложением?IPC между приложениями .NET и C++
4
A
ответ
4
Вы можете использовать Socket для простой связи. Это в ОС, поэтому вам не нужны новые библиотеки. Подробная информация в C++ Socket и C# Socket
Если межпроцессная связь всегда будет выполняться на одной машине, именованные каналы - это путь, потому что они быстрее других.
3
простой (хотя и ограниченный) механизм IPC является WM_COPYDATA message
Вы можете легко использовать его для передачи на структуру в исходное приложение.
Я использую следующий вспомогательный класс:
public static class CopyDataHelper
{
[StructLayout(LayoutKind.Sequential)]
public struct COPYDATASTRUCT
{
private int _dwData;
private int _cbData;
private IntPtr _lpData;
public int DataId
{
get { return _dwData; }
set { _dwData = value; }
}
public int DataSize
{
get { return _cbData; }
}
public IntPtr Data
{
get { return _lpData; }
}
public void SetData<T>(T data) where T : struct
{
int size = Marshal.SizeOf(typeof(T));
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(data, ptr, true);
_lpData = ptr;
_cbData = size;
}
public T GetData<T>() where T : struct
{
return (T)Marshal.PtrToStructure(_lpData, typeof(T));
}
}
[DllImport("User32.dll")]
private static extern bool SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam);
public const int WM_COPYDATA = 0x004A;
public static bool Send<T>(IntPtr fromHwnd, IntPtr toHwnd, int dataId, T data) where T : struct
{
IntPtr ptr = IntPtr.Zero;
try
{
COPYDATASTRUCT cds = new COPYDATASTRUCT();
cds.DataId = dataId;
cds.SetData(data);
return SendMessage(toHwnd, WM_COPYDATA, fromHwnd, ref cds);
}
finally
{
if (ptr != IntPtr.Zero)
Marshal.FreeHGlobal(ptr);
}
}
public static COPYDATASTRUCT Receive(Message msg)
{
if (msg.Msg != WM_COPYDATA)
throw new ArgumentException("This is not a WM_COPYDATA message");
COPYDATASTRUCT cds = (COPYDATASTRUCT)msg.GetLParam(typeof(COPYDATASTRUCT));
return cds;
}
}
Чтобы поймать сообщение WM_COPYDATA, необходимо переопределить WndProc
:
protected override void WndProc(ref Message msg)
{
if (msg.Msg == CopyDataHelper.WM_COPYDATA)
{
CopyDataHelper.COPYDATASTRUCT cds = CopyDataHelper.Receive(msg);
if (cds.DataId == myDataId)
{
MyData data = cds.GetData<MyData>();
msg.Result = DoSomething(data);
return;
}
}
base.WndProc(ref msg);
}
1
Named pipes или я использовал COM Interop оба хорошие варианты.
3
Проверка буферов протокола Google (protobuf). Исходная реализация поддерживает C++, Java & Python, но для .NET есть protobuf-net.
Смежные вопросы
- 1. IPC между клиентскими приложениями .NET и Java
- 2. IPC между Python и C#
- 3. IPC между Java и C++
- 4. Какая техническая разница между настольными приложениями .Net и веб-приложениями?
- 5. . NET: Канал и раковины между несвязанными приложениями
- 6. Связь между приложениями в .NET
- 7. IPC - приложение Excel и .Net
- 8. связь между приложениями (.NET + java)
- 9. Нужно руководствоваться несколькими приложениями IPC
- 10. Общайтесь (IPC) между C++ и Python
- 11. Persistent IPC между Bash сценариев и C++
- 12. C# IPC Между BHO и сервисом
- 13. обмен данными между двумя приложениями в C#
- 14. Передача данных между C# и Java-приложениями
- 15. Mac OS X XPC как IPC между двумя приложениями
- 16. Как применяются права доступа в IPC между приложениями?
- 17. Связь между приложениями .Net 2.0 и .Net 4.0
- 18. Каков наилучший способ для IPC между двумя приложениями C# (32 бит и 64 бит)
- 19. Рекомендации для IPC между родительскими и дочерними процессами в .NET?
- 20. C# IPC Рекомендации и сравнения
- 21. Связь между приложениями AIR (Flex) и C++
- 22. Interprocess Связь между приложениями C++ и vb.net
- 23. Разница между приложениями Java и C#
- 24. Сокет, связанный между приложениями java и C#
- 25. Связь SSL между приложениями Java и C#
- 26. Разница между IPC и CPI
- 27. Совместное использование цепочек между двумя приложениями .NET
- 28. Лучший способ общения между приложениями .Net?
- 29. Дата сериализации между двумя .net приложениями
- 30. IPC mono <-> .NET?