![](/img/trans.png)
[英]IPC between C# app, via native C++ DLL, to another app consuming DLL with embedded Lua?
[英]What is the lightest IPC solution between native C/C++ and C# (.NET)?
我有一個原生的C ++ Visual Studio 2010解決方案,我想將數據發送到.NET應用程序(C#WPF)有沒有辦法用幾行C / C ++代碼執行此操作? 我不想在C / C ++端使用外部依賴項。 有關於此的示例代碼嗎?
更多信息:C / C ++本機應用程序實際上是一個加載到chrome.exe進程的npapi dll。 我不認為這很重要,請證實。
我推薦Named Pipes; 這是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);
}
最后一次機會是使用谷歌的協議緩沖區:原始實現僅支持C ++,Java和Python ......但對於.NET,有protobuf-net 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.