1

我有一个与内存中的远程 dll 有关的高级问题。我有采用 Dlls(Starter.DLL entryType) 的 wcf 服务还有一个 Process dll,它被 wpf 应用程序引用。我有一些步骤:

1) wcf 需要 Dlls (添加到流内存..)

2)处理从wcf读取的dll

3)进程dll将dll添加到currentdomain


 foreach (byte[] binary in deCompressBinaries)
                        {
                            AppDomain.CurrentDomain.Load(binary);
                        }

4) wpf 访问 Process 的 CreateApplication 方法


  this._btnStartApp.Click += (s, args) => 
            {
               Process appMngr = new Process ();
                appMngr.CreateApplication();
            };

创建应用程序方法:


  object obj = appLoader.CreateInstance(appLoader.EntryType);
            MethodInfo minfo = obj.GetType().GetMethod("Execute", BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance);

但我在 getMethos 结果中看不到 Execute 方法,如果 QuickWatching,如何在另一个 currentdomain 中运行 Execute 方法?此 Dll 正在添加 Process Dll 的 currewntdomain 而不是 wpf currentdomain。

在此处输入图像描述

4

1 回答 1

1

AppDomain 很难使用然后动态加载 DLL。

第一的; 如果您看不到该方法,则验证您是否可以获得对象的类型。如果您可以看到该对象应该被加载到当前域中的类型。然后,您可以遍历这些方法并检查这些方法,看看是否有某些内容与 GetMethod 调用不匹配,这可能会导致它无法显示。CreateInstance 标志可能是问题所在,我相信它用于构造函数。

第二; 如果您希望事情在单独的应用程序域中运行(当您想稍后卸载 dll 时非常重要),那么您必须构建 3 个东西。

  1. 创建一组可以处理动态 DLL 的所有加载和执行的类。

  2. 创建一个接口,允许您的主代码与这组类对话;此 iterface 不能返回来自动态 DLL 的任何类型;如果确实如此,您要么加载该 DLL,要么崩溃。我记得可能需要 marshal by ref,但不确定,已经有一段时间了。

  3. 将事件处理程序附加到您的主应用程序域,当您将 DLL 加载到该应用程序域时会通知您。如果您无意中将 DLL 加载到当前的 AppDomain 中,这将是您可以调试的方式。 http://msdn.microsoft.com/library/system.appdomain.assemblyload.aspx

现在您可以创建一个新的 Appdomain,在其中调用您的加载代码并通过界面获取结果。如果您可以完成通话并且您没有触发加载事件,那么您就可以正常工作。完成后,您可以取消 AppDomain 并且加载的 DLL 随之而来。

祝你好运,这很难弄清楚并正常工作。

于 2012-05-26T08:41:42.603 回答