之所以叫做异常猜想,是因为不确定具体出错的原因,但是原因肯定也跑不过如下的分析。
最近在写一个Macro的自动化程序,期望创建一个winform,并将ToolBox中的相应控件添加到Form Desinger上面。不能直接通过Object模型来实现,却可以通过IDesingerHost完成。
但是遇到如下异常:
1. 序列化异常。desingerHost.CreateComponent(GetType(<Control Type>))
2. COM转换异常。ISelectionProvider sp = serviceProvider.GetService(ISelectionProvider) as ISelectionProvider
解答:
1. 首先,从异常的信息可以推断出,control不支持序列化,所以无法创建相关的控件。但是为什么要序列化?我猜想可能是要与另一个进程相互通信,传递信息,所以需要控件序列话。但这似乎又属于Remoting,或wcf的事,能否通.net Remoting来实现呢?答案是肯定的,但这只能应用Custom控件上。也就是说,自己写了一个control,并实现了Remoting接口,你就可以解决此类问题,当然还要加上序列化,但此时貌似不必要了。
2. 对于第二个问题,我个人认为最有可能的原因是由于Visual Studio的Macro不支持两个进程之间的通讯,所以如果通过Add-In,Macro代码与form designer是在一个进程当中,在同一个.dll文件里。所以如果不想通过Add-in的形式完成Visual Studio的程式,请参考.NET Remoting.
***************************************************************************************
补充: 最终通过实验证明,猜想的结果是正确,即不支持两个进程之间的通讯。我们只能通过Add-in的形式来实现此问题的Automation.
****************************************************************************************