从另一个应用程序中运行一个应用程序的功能

时间:2013-08-19 17:41:53

标签: vb.net appdomain

我有两个独立的应用程序: 第一个:

    Namespace FirstApplication
        Class MainWindow
            Public Sub New()
                InitializeComponent()
            End Sub

            Public Function RunBatch(Parameter as String) as Double
                'Do some work
                Return SomeValue
            End Function

        End Class
    End Namespace

第二次申请:

    Namespace SecondApplication
        Class MainWindow
            Public Sub New()
                InitializeComponent()
            End Sub

            Public Sub RunBatch()
                'Call RunBatch() from first Application, get show the result
                Msgbox(RunBatch)
            End Function

        End Class
    End Namespace

两者都是WPF,基于.Net 4.0。目标是在第一个应用程序上调用第二个应用程序并在其中执行一个函数。

关键部分是两个应用程序主要独立使用,偶尔只在第一个应用程序上进行第二次调用。因为两个应用程序都需要以可执行文件的形式存在,所以我不想通过创建第一个应用程序的dll来解决问题 - 我需要保持可执行文件和dll更新到目前为止,如果它们失去同步可能带来灾难性的后果

所以问题是,是否有可能在第二个应用程序的AppDomain中创建第一个应用程序的实例,并且至关重要的是,执行该实例的功能。

2 个答案:

答案 0 :(得分:0)

我不相信你可以在另一个内部创建一个AppDomain。

您拥有的任何其他选项(使用WCF,旧式.NET Remoting或跨越AppDomain)都会比制作两个应用程序都可以引用的单个DLL更复杂。只要不更改共享DLL的程序集编号,如果对DLL进行更改,则不必重新编译每个exe(假设您没有像更改方法签名那样进行重大更改)。

FirstApplication是否必须对SecondApplication执行某些操作?您是否尝试从另一个应用程序控制一个应用程序的功能?如果是这样,您将需要像WCF(使用命名管道或只是一个自托管的Web服务)。或者只是尝试不必两次编写相同的代码?那么最简单的方法可能就是创建一个DLL应用程序引用。

答案 1 :(得分:0)

显然,这可以通过反思来完成。这个过程很简单,虽然不像使用dll那么方便。

Public Class CalltoExternallApp
'this is the declaration of the external application you want to run within your application
Dim newAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom("Mydirectory\Myfile.exe")
Public Sub Main()
            'Loads the main entry point of the application i.e. calls default constructor and assigns handle for it to MyApplication
            Dim MyApplication = newAssembly.CreateInstance("MyApplication.RootClass")
            'Get the type which will allow for calls to methods within application
            Dim MyApplicationType as Type = newAssembly.GetType("MyApplication.RootClass")
            'If calling a function, the call will return value as normal. 
            Dim Result As Object = LunaMain.InvokeMember("MyFunction", Reflection.BindingFlags.InvokeMethod, Nothing, MyApplication, MyParameters)
End Sub
End Class

此处还检查是否将事件处理程序添加到通过Reflection创建的实例: http://msdn.microsoft.com/en-us/library/ms228976.aspx