我需要在c#控件中调用c#应用程序,因为我不想将应用程序重写为控件。
我可以使用System.Diagnostics.Process.Start启动应用程序。
现在如何从/通过c#控件调用我的应用程序中的方法,因为这是我使用System.Diagnostics.Process.Start调用应用程序的地方
答案 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以获得更简洁的代码。