美好的一天,
我的目标是在C#中创建一个程序(Windows服务,它只是一个控制台应用程序),它使用未引用的.dll,并为.dll中的方法创建线程。
换句话说:我想创建一个程序来启动未知.dll的
方法的线程例如,我的.dll名为testdll.dll,其中包含方法cWrite() 使用我的主程序,我想为cWrite()创建一个线程,但是没有引用.dll。
目前我的代码如下:
var assembly = Assembly.LoadFrom("testdll.dll");
var aClass = assembly.GetType("testdll.Class1");
dynamic instance = Activator.CreateInstance(aClass);
Thread t1 = new Thread(instance.cWrite());
我收到错误:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法在System.Dynamic.UpdateDelegates.UpdateAndExecute1 [T0,TRet]的CallSite.Target(Closure,CallSite,Object)中将类型'void'隐式转换为'object'(CallSite站点,T 0 arg0 )在C:... \ Program.cs:第85行的testService.Program.Main()中
我知道有多种方法可以使用未引用的dll,但是在其中一个dll中为方法创建一个线程就是我正在努力的方法。
感谢任何帮助,
问候
杰夫
答案 0 :(得分:1)
您可以简单地:Thread t1 = new Thread(() => instance.cWrite());
作为Thread
构造函数需要委托才能在将cWrite()
(void
)的结果传递给它时进行调用。
答案 1 :(得分:0)
为什么不使用MEF?您可以设置.dlls的搜索目录,然后将任何.dll放在那里。您需要在代码中包含的唯一内容是使用对象时的界面。
https://msdn.microsoft.com/en-us/library/dd460648(v=vs.110).aspx
导出和导入所需的公共接口示例:
interface IMyMEFExample
{
public string HelloFromMEF();
}
示例导出的类:
[Export(typeof(IMyMEFExample))]
public class MyExportedMEFClass : IMyMEFExample
{
public string HelloFromMEF()
{
return "Hello from MEF!";
}
}
MEF消费示例:
class ImportMEFExample
{
[Import(typeof(IMyMEFExample))]
private IMyMEFExample importedMEF;
public ImportMEFExample()
{
Console.WriteLine(importedMEF.HelloFromMEF());
}
}