将对象作为命令行参数传递

Dan*_*gen -1 c#

我有一个父应用程序,我希望它运行一个子应用程序并将一个复杂的对象传递给它以便子应用程序执行。我到处搜索并提出了这些解决方案,但由于以下原因对我不起作用

使用 Json.Net 进行序列化/反序列化:这不起作用,因为我有 JSON.Net 无法确定如何反序列化的抽象和接口,并且强制它这样做似乎很复杂。

使用 IPC:我仍然需要向应用程序中的每个类添加 [Serializable] 属性,由于项目的大小,这确实太难了。

远程处理:对于我想要执行的简单任务来说似乎太多了。

我需要的 ?

子应用程序伪代码

static void Main(ComplexObject obj)
{
     //Here i got my object!.... (passed from parent by Process.Start's args)
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ton 5

我认为您已经在问题中找到了在进程之间共享对象的两种主要方法:序列化或远程访问。我将尝试解释为什么没有“更简单”的方法来做到这一点以及为什么这些解决方案有效。

想象一个复杂的对象:它保存对其他对象(可能是接口/基/抽象类)的引用,文件和锁等资源句柄等。所有这些东西都位于父进程中,子进程无法直接访问。这就是现代操作系统的工作原理。

解决这个问题的一种方法是找到所有的碎片[1],将它们收集起来[2],以对另一个进程有意义的方式写下来[3],然后将它们传递给子进程。这本质上就是序列化的作用,无论您使用的是 JSON、XML 还是二进制数据文件。

细节:

  1. 如果您有基类指针,则需要找出对象的具体(真实)类才能找到其所有部分(成员),因为基类仅代表对象的一部分。幸运的是,C# 反射使这部分变得不那么困难。

  2. 如果你的对象图中有一个循环(对象 A 引用 B,B 又引用 A),那么你必须小心收集对象的精确程度,否则你将陷入无限循环。当对象 A 的成员 B 持有对象 A 的侦听器/委托时,这种循环很容易发生。

  3. 文件、锁、数据库连接和其他资源通常由特定于进程的句柄(数字)引用,这些句柄对另一个进程没有任何意义。

另一种方法是“远程”访问父进程中的对象。想象一下,子进程是客户端,父进程是服务器。您可以在父级中编写一个接口,将对象的方法公开给子级。这样孩子就可以使用该物体而无需实际拥有它。当对象具有无法共享的状态和资源时,这种方法可能是合适的。

我希望能够让您了解可能的解决方案必须处理哪些问题,并帮助您选择适合您的项目的策略。