所以我正在处理一个项目,并且我正在应用程序中启动一个应用程序。
UnitOfWork.Current = new UnitOfWork(new PollerContext());
UnitOfWork.Current.BeginTransaction();
try
{
var launcher = new Launcher();
var arg = launcher.ObjectToString();
System.Diagnostics.Process.Start(@"C:\..\bin\Debug\Emulator.Exe");
}
finally
{
UnitOfWork.Current.Commit();
UnitOfWork.Current = null;
System.Environment.Exit(1);
}
现在我需要将两个对象传递给第二个应用程序,我尝试将它们序列化并将它们作为第二个应用程序的string[]
参数传递,但它们无法序列化。
这两个对象是castle.windsor
容器,如果可以帮助的话。
这些序列化是否可以使这段代码有效,还是有其他方法可以做到这一点?
public string[] ObjectToString()
{
var obj = ReturnObjects();
for (int i = 0; i < obj.Length; i++)
{
using (MemoryStream ms = new MemoryStream())
{
new BinaryFormatter().Serialize(ms, obj[i]);
serialize[i] = Convert.ToBase64String(ms.ToArray());
}
}
return serialize;
}
private object[] ReturnObjects() => new object[] { pollerLauncher, backendLauncher };
答案 0 :(得分:0)
您必须查看进程间通信(IPC)协议,但基本上您将不得不自己创建一个低级别的通信协议(例如通过原始TCP套接字),或者(我建议) )利用WCF抽象出那些细节。
答案 1 :(得分:0)
直接在两个.NET应用程序之间传递对象的唯一方法是避免将第二个应用程序作为单独的进程启动。这就像引用exe并调用方法一样简单。
当然,这意味着它不会作为单独的进程运行。但是如果你想要共享对象,那真的是无法避免的。唯一的例外是远程处理,它在应用程序之间进行调整 - 但即便如此,也需要您的对象通过继承MarshalByRefObject
进行协作。
默认情况下,对象在序列化方面没有多大意义。序列化实际上是关于数据的,所以如果您的对象不仅仅是数据容器,那么您就遇到了麻烦。即使容器本身支持序列化,要真正使其工作,您还必须确保它可能实例化的所有可能对象也支持序列化。合同无法执行此操作。即使每个人都支持序列化,合同也会被违反 - 单身人士不再是单身人士,你有很多碰撞和其他错误的机会(例如,一个对象可能会创建一个唯一的id,另一个会引用它,但是当它们被序列化时,第一个将创建一个新的唯一ID(实际上保持唯一),而第二个将继续引用旧的。)
但是,大多数DI容器也支持配置设置。您可以在应用程序之间轻松传递此配置,并允许目标重建类似的依赖关系树。
目前尚不清楚你究竟想要完成什么,所以我可以提供更多帮助。很可能你正在解决XY问题,完成第一部分,所以只留下不可能的部分。
答案 2 :(得分:0)
感谢Lasse-v-karlsen我更多地考虑将容器保留在第二个项目中。我只隔离了将在多个项目中使用的部件并将其安装到容器中。启动其他服务将保留在第一个项目中。
所以现在它可以工作,我不需要额外的参数来启动第二个项目。