DLL 如何与父级通信? WCF 是唯一的解决方案吗?

Posted

技术标签:

【中文标题】DLL 如何与父级通信? WCF 是唯一的解决方案吗?【英文标题】:How can a DLL communicate back to its parent? Is WCF the only solution? 【发布时间】:2016-03-31 13:22:56 【问题描述】:

我已经组合了一个我计划为其编写插件的应用程序。为了将所有内容分开并使更新变得容易,我认为编写单独的类库将是最好的解决方案。我遇到的问题是我的 dll 无法与它的父级通信。这只是单向通信吗?

我在运行时动态加载 dll 并可以告诉它做我想让它做的事情而不会出现任何问题。我遇到的问题是在它完成工作后,我无法让它向父母发出它已经完成的信号。我不想让父母挂起等待它,所以我在 dll 中打开一个新线程来做“工作”。我尝试了一些简单的方法,例如在打开 dll 时将自引用传递给它,但是当我尝试从 DLL 访问父级上的某些内容时出现访问冲突。

我的所有搜索都提到了 WCF 和命名管道。我觉得它应该是一个比这更简单的解决方案,比如自我参考。 WCF 是解决这个问题的方法吗?还有其他/更好的解决方案吗?

ModuleHandler.cs:

using System;
using System.IO;
using System.Reflection;

namespace Collector

    class ModuleHandler
    
        public ModuleHandler()
        
            LoadStaticModules();
        

        private void LoadStaticModules()
        
            Assembly assembly = Assembly.Load("Module_WaitForIt");
            Type[] types = assembly.GetTypes();
            dynamic module = Activator.CreateInstance(types[0]);
            module.StartSleeping();
        

        public void TestMethod()
        
            Console.WriteLine("TestMethod()");
        
    

Module_WaitForIt:

using System.Threading;

namespace Module_WaitForIt

    public class WaitModule
    
        public void StartSleeping()
        
            System.Console.WriteLine("Sleeping");
            Thread t = new Thread(() => SleepyThread());
        

        public void SleepyThread()
        
            Thread.Sleep(10000);
        
    

在本例中,我希望 Module_WaitForIt.SleepyThread() 在休眠 10 秒后调用 ModuleHandler.TestMethod()。

【问题讨论】:

“我的 dll 无法与它的父进程通信” - 你实际上是在生成一个子代理进程来加载你的 DLL 吗?或者您使用子 AppDomains?如果两者的答案都是否定的,那么您就不需要通信 - 只需调用一个方法。 如果您真的在同一台机器上使用两个不同的进程,请查看Object Sharing between Applications?。本地机器有多种形式的 IPC,都比 WCF 性能更高 @MickyD WCF 与命名管道绑定非常快。 @nodots 是的,但是没有所有 WCF 和 XML 开销的直接命名管道甚至更快。 @MickyD 抱歉,用词不当。基本上,我有一个包含 dll 的目录,并在运行时通过 Assembly.Load() 加载它们。我知道它们不是单独的进程,我会澄清我的问题并添加一些代码。 【参考方案1】:

有很多方法不需要 WCF,例如

您的动态加载程序集可以实现接口或派生自在程序集中定义的基类,该程序集和您的父程序集都引用该程序集。例如,此接口或基类可以包含您可以引发以将数据传递给父程序集的事件。

您的动态加载程序集可以包含采用类型为在另一个程序集中定义的接口的参数的方法。当您的父级调用您的方法时,它会向您传递一个实现该接口的具体实例,您可以在适当的时候调用它。

【讨论】:

以上是关于DLL 如何与父级通信? WCF 是唯一的解决方案吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持垂直位置的同时使 div 与父级的右侧对齐?

present Modal View Controller:如何与父级交互

如何使 div 与父级高度相同(显示为表格单元格)

卡片宽度与父级匹配:颤动

鼠标滑过,解决ul下 li下a的背景与父级Li不同宽的问题

使用 WCF 通过 Windows 服务和 Windows 窗体应用程序进行通信