2010-08-31 93 views
0

我有一个VSTO插件,它工作正常。我试图给它一个插件加载机制,以便其他人可以将插件添加到我的插件。我知道,我听起来很可怕,但现在看来似乎是最好的选择。VSTO插件依赖分辨率

我将我的插件发布到名为'发布'的文件夹。这将创建应用程序清单(Symbols.application),并创建一个名为Symbols_x.y.xx.yy的文件夹,其中包含实际的插件程序集。每次发布时,Visual Studio都会增加此版本号,所以程序集永远不会在同一个地方出现两次。

插件位于发布\插件文件夹中。我使用Assembly.LoadFile(字符串)加载插件程序集,这工作正常。无论发布多少次,插件都位于同一位置的文件夹中,我可以扫描该文件夹中的DLL并加载它们。

什么不工作是当这些插件DLL有依赖关系。特别是,一个取决于一个COM对象。 Visual Studio会生成一个自动Interop DLL,并将其放入发布\ Plugins文件夹以及相应的插件DLL中。一旦尝试访问COM对象,就会抛出异常,并说找不到互操作程序集。

将interop DLL放入发布\ Symbols_x.y.xx.yy文件夹的文件夹中,但需要每次都手动将它放在那里。我已经尝试将插件添加到AppDomain的PrivateBinPath中,但文档中说ApplicationBase之外的任何内容都将被忽略,看起来确实如此 - 它不起作用。 ApplicationBase被设置为Published \ Symbols_x.y.xx.yy。

在我看来,我有四个选项:

  • 图如何改变ApplicationBase,移动它一个级别,然后添加发布\ Plugins文件夹到AppDomain中的PrivateBinPath。
  • 对应用程序清单进行一些更改以指示程序集可以从Published \ Plugins自动加载。
  • 找到一些其他方式显式地将程序集加载到AppDomain中,而不是使用Assembly.LoadFile将程序集加载到内存中。
  • 任何人都想要建议!

但我找不到任何方法让这些选项工作。帮帮我!

回答

0

溶液通过MSDN论坛提供:

我已经添加了一个事件处理程序AppDomain.CurrentDomain.AssemblyResolve。这使您有机会以任何喜欢的方式加载程序集,包括从我的插件目录中加载程序集。