我怎么能让我的插件从自己的路径加载程序集,而不是我的.exe加载它们
本文关键字:我的 加载 exe 程序集 插件 怎么能 自己的 路径 | 更新日期: 2023-09-27 18:11:29
我有一个小的软件应用程序,我有一些插件在。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的有用提示。