通过WCF暴露Winforms应用程序的内部
我正在尝试着迈入IPC和WCF的第一步,到目前为止,我还是落在了我的脸上。我有一个Winforms应用程序,我想对远程调用者进行一些测试。 winforms应用程序的大部分业务逻辑都局限于一个负责所有后台工作的单例。我想通过IPC机制公开一些功能。 WCF看起来像是前进的方向,所以我从此开始。通过WCF暴露Winforms应用程序的内部
我试过的是向我的解决方案中添加一个WCF服务库项目,通过它我想公开一些调用。当我在VS调试器中启动Winforms项目时,它正常运行,WcfSvcHost启动。我可以使用WcfTestClient与WCF服务进行通信。
但是,当我尝试访问持有代码的单例时,我想与之通信,看起来好像我正在获取新的单例对象。显然,我做错了;我猜想发生的事情是服务运行在不同的进程中,所以没有真正的共享代码,因此没有共享的单身人士。
我不知道该如何继续。我选择使用WCF的IPC是错误的吗?我应该将WCF端点集成到Winforms应用程序中吗?我正在尝试甚至可行吗?
编辑:我想这是如此高层次,也很简单,任何代码示例都是无用的。我认为我错了。因此,一些代码:
在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这是不一样的DateTime作为winforms单例的安装。
EDIT2:
我有这样的代码运行的是(与周围的WinForms东西自动生成的脚手架)。表单上的标签显示的时间与WCF调用返回的时间不同,表明它是一个不同的实例。
这里的问题是WCF服务主机托管服务,而不是应用程序本身。这导致应用程序在独立的ApplicationDomain中运行,这反过来又导致创建一个新的单例。切换到自行托管解决了这个问题。
我假设你正在使用你的单例类作为服务(它实现了一个契约)。我建议你开发一个WCF合约和一个服务,它将打电话给你的单身人士。
所以你有这样的事情:
public class YourImpportantSingleton
{
public YourImpportantSingleton Instance { get; set; }
public void DoSeriousBusiness(){...}
}
[ServiceContract]
public interface IYourContract
{
void YourRemoteAction();
}
public class YourService : IYourContract
{
public void YourRemoteAction()
{
YourImportantSingleton.Instance.DoSeriousBusiness();
}
}
UPD:好,刚刚意识到,你可能无法使用自托管的WinForms应用程序,抱歉的时间浪费。
然后,您的选择将在您的表单应用程序中使用ServiceHost
托管服务,或单独托管服务(例如使用IIS)并使此服务成为您的单身人员的管理员。您必须更改您的表单应用程序才能调用单独的服务,因为它当前拥有该状态。
带WCF的IPC通常使用命名管道完成。它当然受到支持;但是有很多开销。除了WCF之外,还有更多高性能的IPC方法。内存映射文件,例如。 – 2012-07-26 15:50:03
你的意思是WCF而不是WPF?这是第一次设置:首先让它工作,然后让它有效地工作。由于我还没有第一步工作,我还没有到第二步,但我认为命名管道将是一个很好的候选人。我会查看内存映射文件,感谢您的建议。 – Martijn 2012-07-26 15:52:51
是的,WCF,而不是WPF ... autocorrect :) – 2012-07-26 15:53:52