Reflection.Net:如何加载依赖项?

时间:2008-10-08 09:09:06

标签: c# reflection dependencies add-on

我尝试使用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");

不要改变任何东西。

5 个答案:

答案 0 :(得分:40)

如果 MyTools.dll Addon.dll 位于同一目录中,您只需拨打Assembly.LoadFrom而不是{{1}使代码工作。否则,处理Assembly.LoadFile事件是可行的方法。

答案 1 :(得分:2)

您是否考虑过使用Inversion Of Control容器?我使用Castle Windsor和一个外部Boo文件,这样我就可以轻松扩展应用程序而无需重新编译或担心提供依赖项

答案 2 :(得分:1)

几个选项:

  1. 您可以附加到AppDomain.AssemblyResolve以帮助CLR解决程序集。
  2. 您可以考虑将加载项隔离到自己的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一起使用。

谢谢你们。