如何从控件中调用c#windows应用程序?

时间:2008-10-29 19:32:35

标签: c#

我需要在c#控件中调用c#应用程序,因为我不想将应用程序重写为控件。

我可以使用System.Diagnostics.Process.Start启动应用程序。

现在如何从/通过c#控件调用我的应用程序中的方法,因为这是我使用System.Diagnostics.Process.Start调用应用程序的地方

5 个答案:

答案 0 :(得分:1)

最简单的方法是将应用程序从.exe更改为.dll,然后像普通库一样引用项目中的应用程序。

答案 1 :(得分:0)

您无法调用另一个进程的“方法”,因为它在完全不同的操作系统进程中运行。您必须基本上要求进程为您执行一个方法,等待结果,然后将信息编组回您的进程。当然,您必须通过某种进程间通信技术(如WCF,COM +等)公开这些方法。如果您对执行程序有这种访问权限,您也可以直接使用程序集。

如果你能提供帮助,你真的不想这样做。这会更麻烦。

答案 2 :(得分:0)

由于您拥有源代码,请将其复制到新项目中或按照@Nick Berardi的建议创建DLL。

答案 3 :(得分:0)

您可以修改.exe应用程序并为其添加远程处理接口,使其成为服务器进程,然后让您的“控件”充当客户端进程并在服务器上调用方法。

这是一个hacky设计,我不推荐它,但因为你问:)

答案 4 :(得分:0)

无论EXE或DLL格式如何,您都可以使用System.Reflection进入任何程序集。

要运行其他应用程序,例如

string fileName = "MainApp.exe";
string className = "Program";
string methodName = "Main";
string[] args = {"arg1", "arg2"};

Assembly asm = Assembly.LoadFrom(fileName);
foreach (Type typ in asm.GetTypes())
{
    if (typ.Name == className) 
    {
        BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
        MethodInfo method = typ.GetMethod(methodName, flags);
        method.Invoke(null, new object[] { args });
    }
}

要使用其他方法,请相应更改名称。

这是基于我最初从this example派生的实际工作代码。

可能有更好的方法来编写它 - this thread suggests using the Activator class以获得更简洁的代码。