我需要将 C# 内存对象从一个进程传递到另一个进程 (IPC)
我只是尝试在文件中序列化这个对象,然后在我的第二个进程中使用二进制序列化 ( BinaryFormatter )反序列化它以获得良好的性能。
不幸的是,性能没有达到我的预期。由于我的对象有很多信息,序列化和反序列化需要太多时间(我的对象序列化在我的硬盘上占用了 1MB 以上)。
我听说过
内存映射文件 (MMF)
当进程之间共享的对象很简单时,这似乎是 IPC 最快的方法之一。 在 C# 中的 2 个进程之间进行通信的最快和最简单的方法是什么?
我的对象只是简单的嵌套结构,如下所示:
public struct Library
{
public Book[] books;
public string name;
}
public struct Book
{
public decimal price;
public string title;
public string author;
}
Run Code Online (Sandbox Code Playgroud)
=>是否可以避免序列化/反序列化并与 MMF 共享此类对象?
=>共享对象的特征应该是什么,以避免这些序列化/反序列化操作?
还有一个限制:我的第一个进程是一个 C# 64 位进程,我的第二个进程是一个 32 位进程。
谢谢
会是怎样一个快速的方法来拷贝/转换一个array的Color32[]值的byte[]缓冲?
Color32是Unity 3D中包含的结构4 bytes, R, G, B and A respectively。我要完成的工作是将渲染的图像从整体通过管道发送到另一个应用程序(Windows Forms)。目前,我正在使用以下代码:
private static byte[] Color32ArrayToByteArray(Color32[] colors)
{
int length = 4 * colors.Length;
byte[] bytes = new byte[length];
IntPtr ptr = Marshal.AllocHGlobal(length);
Marshal.StructureToPtr(colors, ptr, true);
Marshal.Copy(ptr, bytes, 0, length);
Marshal.FreeHGlobal(ptr);
return bytes;
}
Run Code Online (Sandbox Code Playgroud)
谢谢,抱歉,我是StackOverflow的新手。Marinescu Alexandru
[StructLayout(LayoutKind.Sequential)]
public struct Demo
{
double X;
double Y;
}
var data = new Demo[128];
FillWithMeaningfulValues(data);
double[] doubles;
Copy(data, out doubles); // ?
Run Code Online (Sandbox Code Playgroud)
如何将演示阵列复制到双精度数组中,而不必(...)通过每个元素?在C++中,我会使用memcpy,但在C#中我没有找到Marshal.Copy中我需要的东西.
void MethodIDoNotWantToUse(Demo[] demo, out double[] doubles)
{
doubles = new double[demo.Length * 2];
for(int i = 0, j = 0; i < demo.Length; ++i)
{
doubles[j++] = demo[i].X;
doubles[j++] = demo[i].Y;
}
}
void MethodIWouldPreferToUse(Demo[] demo, out double[] doubles)
{
doubles = new double[demo.Length * 2];
memcopy(doubles, demo, demo.Length * 2 * sizeof(double));
}
Run Code Online (Sandbox Code Playgroud)