我在同一台计算机上运行了两个相同的.NET(C#)应用程序实例。我需要将一些相对复杂的对象从一个实例传递到另一个实例。什么是最好的方法。
对于后台,实例是我们的Office AddIn,如果Word和Excel都在运行,它们每个都创建一个AddIn的不同实例。没有办法让他们使用同一个实例。
这是一次性传递从实例A到实例B的数据。我确实想到了一个命名管道,但我相信这将是一个皇家PITA序列化和反序列化所有对象 - 它们复杂
答案 0 :(得分:0)
第一步是确定您尝试共享的对象是否可以序列化。
最佳案例情景
如果它及其所有后代属性都是POCO / Structs,那么这不应该是一个问题。首先参考Newtonsoft.Json,然后使用下面的代码。
由于序列化器和反序列化器都是Newtonsoft.Json,我们可以使用类型名称处理和保留引用处理选项,以允许序列化更复杂的类型。
var serializerSettings = new JsonSerializerSettings
{
{
Formatting = Formatting.Indented, // Can remove if you won't read output.
TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple, // Don't force specific version of assembly.
ReferenceLoopHandling = ReferenceLoopHandling.Serialize, // Serialize reference loops, PreserveReferencesHandling will prevent infinite loop.
PreserveReferencesHandling = PreserveReferencesHandling.All, // Use $ref and $id for looped references.
TypeNameHandling = TypeNameHandling.All // Include type name of objects when serializing.
};
}
var json = JsonConvert.Serialize(obj, serializerSettings);
假设序列化的类型及其所有属性后代都有无参数构造函数且属性没有做任何奇怪的事情,这不应该有任何问题。
测试它,如果它有效,你可以删除PreserveReferencesHandling,TypeNameHandling和ReferenceLoopHandling选项;但是,如果对象具有引用循环或包含引用属性包含继承类型的对象而不是属性定义类型的任何属性,则序列化可能会失败。
假设序列化成功,您可以使用您首选的IPC方法,只需传输JSON并在另一端反序列化。
对于内存映射文件,您可以使用本指南http://www.codingvision.net/tips-and-tricks/c-send-data-between-processes-w-memory-mapped-file
在该示例中,不使用BinaryFormatter,而是使用NewtonSoft.Json的示例。
如果上面没有工作
其中一个属性或后代属性不能使用上述选项进行序列化。如果这是由无参数构造函数引起的,那么您需要创建自己的转换器以进行反序列化。见https://www.newtonsoft.com/json/help/html/CustomJsonConverter.htm
如果其中一个后代属性类型由于某些其他原因而无法序列化,那么对于一个简单的"你可能会运气不好。溶液
此时,您必须为您尝试发送的内容创建DTO,并知道如何从DTO中的数据构建您想要的内容。< / p>
通常这不是问题,除非奇怪地使用属性(getter / setter使用不安全的代码,或者有其他副作用&#34;)。我不熟悉MS Office库,但如果由于这个原因,引用正在处理的文档中的某些类型无法序列化,我不会感到惊讶。
<强>结论强>
您的问题意味着您还没有尝试过序列化。你必须尝试,因为你不知道在你做什么之前你会遇到什么问题而且它会失败。
如果您很幸运,上面的JSON序列化代码将正常运行。如果确实如此,那么问题就解决了。使用命名管道或内存映射文件或其他,并在另一端加载它。
如果它不起作用,无论如何都会变得复杂。序列化是您唯一真正的选择,如果您引用的MS Office库类型执行一些时髦的原生/不安全的东西,则需要创建DTO。
你当然可以自己进入不安全的代码并直接进行内存操作而不是序列化...但这是非常不可取的,而且几乎肯定会失败。