是否有可能从另一个C#控制台应用程序控制WinForm?
我已经2天了.NET C#编码器试图获得控制ProjectA - WinForm从ProjectB - C#控制台应用程序。是否有可能从另一个C#控制台应用程序控制WinForm?
基本上我使用WatiN在ProjectA中的WebBrowser控件内自动测试。
当我运行ProjectB执行winformWithWebBrowserTest.exe时,带有webbrowser的winform出现了。但后来无法访问form1。我如何从ProjectB访问webbrowser控件?
错误:
System.Runtime.IteropServices.InvalidComObjectException
COM
object that has been separated from its underlying RCW cannot be used
项目A的WinForm:(winformWithWebBrowserTest.exe)
namespace WindowsFormsApplication1
{
public partial class Form1 : System.Windows.Forms.Form
{
public Form1()
{
InitializeComponent();
}
}//end class
}//end namespace
项目B控制台应用程序:(WatinConsoleExample.cs)
namespace ConsoleApplication1
{
class WatinConsoleExample
{
[STAThread]
static void Main(string[] args)
{
//run ProjectA exe
System.Diagnostics.Process Proc = new System.Diagnostics.Process();
Proc.StartInfo.FileName = "C:\\Users\\m-takayashiki\\Documents\\Visual Studio 2010\\Projects\\winformWithWebBrowserTest\\winformWithWebBrowserTest\\bin\\Release\\winformWithWebBrowserTest.exe";
Proc.Start();
WindowsFormsApplication1.Form1 form1 = new Form1();
var t = new Thread(() =>
{
Settings.AutoStartDialogWatcher = false;
//exception occurs below ..........
var ie = new IE(form1.webBrowser1.ActiveXInstance);
ie.GoTo("http://www.google.com");
ie.TextField(Find.ByClass("lst")).TypeText("this is awesome!!");
ie.Button(Find.ByName("btnG")).Click();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
}
}
你不能这样做,因为这两个进程都在其独立的进程空间&中运行,所以你需要重新进行进程间通信,这是不推荐2天的:)。
是否有替代品,以便我可以运行.exe(由C#构建)弹出winform并有我的单独的C#代码来运行WatiN反对它? – 2011-03-08 08:38:24
可能有一些选择,但我不知道任何这样的,对你的道歉。 – 2011-03-08 08:42:03
嗯窗口处理程序呢?也许这会工作..但我必须测试。 – 2011-03-08 09:32:12
是否有一个特殊的原因,您不只是直接在浏览器中运行网站,并使用众多浏览器自动化工具之一来驱动它,如watin或selenium? – 2011-03-08 17:10:59
我的项目是使用Selenium在.NET中启用对webbrowser的自动化,但似乎WatiN是要走的路。 – 2011-03-09 00:41:30