原生 C/C++ 和 C# (.NET) 之间最轻量的 IPC 解决方案是啥?
Posted
技术标签:
【中文标题】原生 C/C++ 和 C# (.NET) 之间最轻量的 IPC 解决方案是啥?【英文标题】:What is the lightest IPC solution between native C/C++ and C# (.NET)?原生 C/C++ 和 C# (.NET) 之间最轻量的 IPC 解决方案是什么? 【发布时间】:2013-01-15 21:33:02 【问题描述】:我有一个本机 C++ Visual Studio 2010 解决方案,我想将数据发送到 .NET 应用程序 (C# WPF) 有没有什么方法可以用几行 C/C++ 代码来做到这一点?我不想在 C/C++ 端使用外部依赖项。有没有关于这个的示例代码?
更多信息: C/C++ 本机应用程序实际上是一个加载到 chrome.exe 进程中的 npapi dll。我不认为这很重要,请确认。
【问题讨论】:
I do not want to use external dependencies on C/C++ side
-- 这似乎不可能;它是一个 .NET 应用程序,因此您将依赖 .NET,除非您计划使用 SendKeys 或 Windows 消息与该应用程序通信。
这些数据是什么样的?一个简单的字符串消息?
【参考方案1】:
听起来您可以使用named pipes 在进程之间进行通信。
This question 应该有助于为您指明正确的方向。
【讨论】:
【参考方案2】:我推荐命名管道; here 是 C# 和 C++ 之间命名管道实现的一个很好的例子。你也可以实现COM Interop。另一种选择是使用 WM_COPYDATA 消息(要捕获它们,您需要覆盖 WndProc),但是非常受限:
public static class CopyDataHelper
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct COPYDATASTRUCT
private Int32 _dwData;
private Int32 _cbData;
private IntPtr _lpData;
public Int32 DataId
get return _dwData;
set _dwData = value;
public Int32 DataSize
get return _cbData;
public IntPtr Data
get return _lpData;
public T GetData<T>() where T : struct
return (T)Marshal.PtrToStructure(_lpData, typeof(T));
public void SetData<T>(T data) where T : struct
Int32 size = Marshal.SizeOf(typeof(T));
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(data, ptr, true);
_cbData = size;
_lpData = ptr;
[DllImport("User32.dll", CharSet=CharSet.Unicode, ExactSpelling=true, SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern Boolean SendMessage([In] IntPtr hWnd, [In] UInt32 msg, [In] IntPtr wParam, [In, Out] ref COPYDATASTRUCT lParam);
public const Int32 WM_COPYDATA = 0x004A;
public static Boolean Send<T>(IntPtr fromHwnd, IntPtr toHwnd, Int32 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!");
return (COPYDATASTRUCT)msg.GetLParam(typeof(COPYDATASTRUCT));
// Override
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);
最后的机会是使用 Google 的 Protocol Buffers:最初的实现只支持 C++、Java 和 Python……但对于 .NET,有 protobuf-net。
【讨论】:
以上是关于原生 C/C++ 和 C# (.NET) 之间最轻量的 IPC 解决方案是啥?的主要内容,如果未能解决你的问题,请参考以下文章