我已经整理了一个我打算为其编写插件的应用程序。为了使所有内容保持分离并使更新变得容易,我认为编写单个类库将是最佳解决方案。我遇到的问题是我的dll无法与其父母沟通。这只是单向沟通吗?
我在运行时动态加载dll,可以告诉它做我想做的事情而没有任何问题。我遇到的问题是在它完成工作之后,我无法通过它向父母表明它已经完成了。我不希望父母挂起并等待它,所以我在dll中打开一个新线程来做" work"。我尝试了一些简单的事情,比如当它打开时将自引用传递给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()。
答案 0 :(得分:0)
有许多方法可以做到这一点,不需要WCF,例如
动态加载的程序集可以实现接口,也可以从程序集中定义的基类派生,该程序集由程序集和父程序集引用。例如,此接口或基类可以包含可以将数据传递到父程序集的事件。
动态加载的程序集可以包含采用其类型为另一个程序集中定义的接口的参数的方法。当您的父调用您的方法时,它会向您传递一个实现该接口的具体实例,您可以在适当的时候调用它。