C#控制dll访问

时间:2011-01-26 15:27:09

标签: c# dll

我有一个利用插件架构的程序。当初始表单加载时,它会扫描当前目录,查询每个dll并获取一些显示给用户的基本数据。

在使用该程序时,软件通常需要让dll执行一些工作。

我的问题是,当程序最初检查dll文件时,我应该保留对每个dll对象的引用以供将来使用,还是应该每次查询dll文件并在需要时创建对象?

如果它是第一个,那么保留从公共接口派生的未确定数量的对象的列表然后知道在需要时引用哪个对象的最佳方法是什么?

感谢。

4 个答案:

答案 0 :(得分:2)

使用第一个你可以创建一个

List<IYourCommonInterface> pluginDlls

然后只是

pluginDlls.Add(dllReference);

修改

使用词典的替代方法,请注意,这将要求您拥有某种类型的词典ID,您可以使用它来识别dll。

Dictionary<SomeIDField, IYourCommonInterface> pluginDlls

pluginDlls.Add(dllRefrence);

答案 1 :(得分:1)

大多数应用都会检查加载情况。

我不会存储接口列表。如果您确实存储它们,那么您可能会遇到程序集消失或以某种方式更新的可能性。无论如何,你需要“刷新”它们。

答案 2 :(得分:1)

一旦你加载了程序集并获得了一个System.Reflection.Assembly实例用于反射(使用Assembly.Load(),Assembly.LoadFrom(),Assembly.LoadFile()等),程序集就被加载了。引用MSDN on the subject

  

...可以将特定程序集加载到当前应用程序域中   在运行时... 没有卸载就无法卸载单个程序集   包含它的所有应用程序域。即使程序集耗尽   范围,实际的程序集文件将保持加载直到所有应用程序域   包含它的内容已卸载。 [强调我的]

因此,如果您想要卸载DLL直到实际需要它们,那么您将不得不创建一个新的应用程序域然后卸载它。它更容易加载它们并完成它。如果你愿意,你可以保持assemply参考,但如果你再次调用Assembly.Load(),它实际上不会加载程序集:它只是获得对先前加载的程序集的引用。

答案 3 :(得分:0)

如果你经历了查找和加载DLL的麻烦,通常你会想要保留它们。这主要取决于DLL使用了多少资源以及您的应用程序如何使用DLL。

我假设你在这里使用LoadAssembly。您可以使用某种地图存储对已加载的程序集的引用。甚至是你迭代的列表。

也许如果你提供更多细节,我们可以帮助你更好。