我尝试使用Reflection向我的Windows.Net应用程序添加一个插件系统;但是当有附属物时它会失败。
Addon类必须实现一个接口'IAddon'并且有一个空的构造函数
主程序使用Reflection:
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\Addon.dll");
Type t = assembly.GetType("Test.MyAddon");
ConstructorInfo ctor = t.GetConstructor(new Type[] { });
IAddon addon= (IAddon) ctor.Invoke(new object[] { });
addon.StartAddon();
当addon不使用dependencie时,它很有用。
但是如果我的插件引用并使用另一个DLL(C:\ Temp \ TestAddon \ MyTools.dll)保存在磁盘插件附近,则会失败:
System.IO.FileNotFoundException:无法加载文件或程序集“MyTools.dll”或其中一个依赖项。
我不想在我的可执行文件附近复制插件DLL,我怎么能告诉.Net运行时在“C:\ Temp \ TestAddon”中搜索任何依赖?
请注意添加
Assembly assembly = Assembly.LoadFile(@"C:\Temp\TestAddon\MyTools.dll");
不要改变任何东西。
答案 0 :(得分:40)
如果 MyTools.dll 与 Addon.dll 位于同一目录中,您只需拨打Assembly.LoadFrom
而不是{{1}使代码工作。否则,处理Assembly.LoadFile
事件是可行的方法。
答案 1 :(得分:2)
您是否考虑过使用Inversion Of Control容器?我使用Castle Windsor和一个外部Boo文件,这样我就可以轻松扩展应用程序而无需重新编译或担心提供依赖项
答案 2 :(得分:1)
几个选项:
AppDomain.AssemblyResolve
以帮助CLR解决程序集。AppDomain
中(请参阅System.AddIn
命名空间和this website)。答案 3 :(得分:1)
您可以使用反射来访问私人 Assembly.
_GetReferencedAssemblies()
。
虽然的方法可以在.NET框架的未来版本中进行更改,但似乎不太可能--ASP.NET在很大程度上依赖于它,尽管它们可能会从{}移动它{1}}到mscorlib
这是我所知道的唯一一个方法参考的程序集。
答案 4 :(得分:1)
Assembly.LoadFrom运行良好,直到我尝试在我的插件中使用webService,我有一个“无法将'X'类型的对象强制转换为'X'”异常。
这很难看,但我会将Assembly.LoadFile与AppDomain.AssemblyResolve一起使用。
谢谢你们。