我正在开发一个可以加载插件的应用。插件程序集位于应用程序主目录下的目录中。
看起来像这样:
MyAppFolder ----------->ThePluginFolder ----------------Assembly1 ----------------Dependency1
我的问题出现在Dependency1(这是程序集1引用的程序集)。 CLR找不到它。
我已经对Fusion做了一些阅读,看起来好像我可以通过设置一个带有currentAppDomain.AppendPrivatePath的私有路径来纠正这个问题。
但是,在.NET 4.0帮助中,他们说这个方法已经过时了。他们指向我的AppDomainSetup,但我不能用它来修改我当前的应用程序域 有谁知道我还能做些什么才能加载这些依赖项?
我考虑的选项:
我可以手动遍历Assembly1的引用,如果我在插件文件夹中找到一个程序集,我可以手动加载它。 (似乎是我最好的选择,但我想确保我没有遗漏任何东西)
我可以挂钩当前域的AssemblyResolve事件(但这甚至看起来很奇怪 - 你返回一个值。这是否意味着它不是多播?我正在处理插件的一个方面(一个企业)如果我的应用程序的另一部分想要插件报告怎么办?我需要1个全局事件处理程序吗?
答案 0 :(得分:2)
感谢所有的帮助,伙计们。在我的例子中,我发现最好的办法是在我的主应用程序目录中找到插件。虽然我可以使用Load()或LoadFrom()来在不同的目录中加载程序集(并且它似乎可以工作),但后来我遇到了序列化问题(引用的程序集中有需要序列化和反序列化的类)。 / p>
我尝试使用LoadFrom()和Load(),在AssmblyName参数中提供各种证据。我甚至“手动”加载我的插件引用的程序集。没有任何动态加载会使反序列化工作(我有例外)。
我只找到3种方法让动态加载的插件与序列化配合使用:
使用CurrentDomain.AppendPrivatePath添加包含程序集的目录的路径(此方法已过时)
将当前AppDomain中的ResolveAssembly事件挂钩(这可能会有效,但它会被调用很多,我不想影响我的应用程序的性能 - 请注意我还没有进行测量)
只需将程序集放在我的主目录中即可。 (这是最简单的解决方案,反对这样做的唯一理由是目录结构不如我的其他选项那么整洁。所以,考虑到所有事情。我采取了这条路线。
答案 1 :(得分:1)
插件程序集通常使用Assembly.LoadFrom通过反射加载,不应该被项目引用,否则它们是硬编码的。应用程序和插件之间唯一常见的事情应该是包含两个引用的接口的单独程序集。然后你可以有一个配置文件,你可以在其中指定要在运行时加载的插件。
答案 2 :(得分:1)
这个场景对我有用,我的插件直接与我的应用程序目录(它是一个Web应用程序)完全分开,动态加载的DLL在同一个文件夹中找到它们引用的DLL。他们引用的DLL也被我的应用程序加载为插件,所以它确实知道它们的存在......