我正试图迈出进入 IPC 和 WCF 的第一步,但到目前为止,我的脸都跌倒了。我有一个 Winforms 应用程序,我想为远程调用者提供一些工具。winforms 应用程序的大部分业务逻辑都局限于一个处理所有后台工作的单例。我想通过 IPC 机制公开一些功能。WCF 似乎是前进的方向,所以我从那个开始。
我尝试的是在我的解决方案中添加一个 WCF 服务库项目,我想通过它公开一些调用。当我在 VS 调试器中启动 Winforms 项目时,它正常运行,并且 WcfSvcHost 启动。我可以使用 WcfTestClient 与 WCF 服务通信。
但是,当我尝试访问持有我想与之通信的代码的单例时,似乎我得到了一个新的单例对象。显然,我做错了;我猜正在发生的是服务在不同的进程中运行,因此没有真正的共享代码,因此没有共享单例。
我不确定我应该如何继续。我选择为 IPC 使用 WCF 是错误的吗?我应该在 Winforms 应用程序中集成 WCF 端点吗?我正在尝试的方法是否可行?
编辑:我认为这太高级了,也太简单了,以至于任何代码示例都是无用的。我想我错了。所以一些代码:
在 WinForms 程序集中:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
label1.Text = MySingleton.Instance.InitedAt.ToString();
}
}
public class MySingleton
{
private static MySingleton instance = new MySingleton();
private DateTime inited;
private MySingleton()
{
this.inited = DateTime.Now;
}
public static MySingleton Instance
{
get
{
return instance;
}
}
public DateTime InitedAt
{
get
{
return this.inited;
}
}
}
在 WCFServiceLibrary 程序集中:
[ServiceContract]
public interface IApplicationProbe {
[OperationContract]
string DoesItWork();
[OperationContract]
string SingletonInited();
}
public class ApplicationProbe : IApplicationProbe {
public string DoesItWork(){
return "Why yes, yes it does";
}
public string SingletonInited(){
return MySingleton.Instance.InitedAt.ToString();
}
}
当我SingletonInited
通过 WcfTestClient 查询时,我得到一个 InitedAt,它与 winforms 单例的实例化的 DateTime 不同。
编辑2:
我让这段代码按原样运行(使用围绕 Winforms 的自动生成的脚手架)。表单上的标签显示的时间与 WCF 调用返回的时间不同,表明它是不同的实例。