我怎么能让我的插件从自己的路径加载程序集,而不是我的.exe加载它们



我有一个小的软件应用程序,我有一些插件在。zip文件的形式,我下载到一个名为"plugins"的文件夹,这是我的样本磁盘结构:

MyApplication.exe
  |
  |
  |-Plugins (Folder)
       |
       |- Plugin1 (Folder)
       |     |
       |     |- MyPluginAssembly1.dll
       |
       |- Plugin2 (Folder)
             |
             |- MyPluginAssembly1.dll
             |- Assembly1.dll
             |- Assembly2.dll

我的问题是,我有这个插件(Plugin2),它有一些程序集需要加载。问题是,如果程序集位于插件文件夹中,则无法工作,加载插件的.exe无法加载程序集,除非它们注册或驻留在.exe文件的"旁边"。现在我将程序集(Assembly1, Assembly2)复制到包含.exe程序集的文件夹中。有什么办法,我可以保持插件文件夹内的文件,他们属于?

您可以附加到AssemblyResolve事件并从您喜欢的任何路径加载程序集。

AppDomain.CurrentDomain.AssemblyResolve += (sndr, resolveEventArgs) =>
{
    return Assembly.LoadFile("......");
};

试试Assembly.GetExecutingAssembly().Location

注意,这并不总是有效——它可能只会在库是磁盘上的物理.dll时产生预期的行为。在。net中还有其他加载程序集的方法,但从它的外观来看,你的应用程序会工作得很好。

请注意,我还没有试用过它,所以在使用它之前要在各种部署场景中彻底测试它(显然!)

编辑#1:我现在怀疑我是否正确理解了你的问题。GetExecutingAssembly将返回当前程序集(相当明显),所以如果你想要插件库的路径,你需要在插件库中调用这个方法。这是你想要的吗,或者你在问如何从应用程序可执行文件中获得插件的路径?

我建议在配置文件中使用codebase标记,就像MSDN在这里建议的那样。注意,除非您在GAC中注册它们,否则您只能将库放置在您的目录main application下(就像在您的用例中一样)。下面是一些关于CodeBase的有用提示。

最新更新