繁体   English   中英

如何从控件调用ac#Windows应用程序?

[英]How do I call a c# windows application from a control?

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

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

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

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

您不能调用另一个进程的“方法”,因为它在完全不同的OS进程中运行。 从本质上讲,您将不得不要求流程为您执行一个方法,等待结果,然后将信息编组回您的流程中。 当然,您将不得不通过某种进程间通信技术(例如WCF,COM +等)公开这些方法。如果您可以对执行程序进行这种访问,则也可以直接使用程序集。

如果您能提供帮助,那么您真的不想经历那件事。 这将更加麻烦。

既然有了源代码,请按照@Nick Berardi的建议将其复制到新项目中或创建一个DLL。

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

这是一个骇人听闻的设计,我不推荐使用,但自从您问到:)

您可以使用System.Reflection进入任何程序集,而无需考虑EXE或DLL格式。

例如,要运行另一个应用程序,

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 });
    }
}

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

这是基于我最初从此示例派生的实际工作代码。

不过,可能有更好的编写方法- 该线程建议使用Activator类获得更简洁的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM