【发布时间】:2012-10-11 10:17:59
【问题描述】:
场景:我想在运行时加载解决方案中存在的程序集。
belo 代码将不起作用,因为它不存在于当前应用程序域中。
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
此外,如果我将在引用的程序集中进行搜索,那么它也无法找到,因为它没有被引用。所以下面的代码也不起作用:
public static IEnumerable<Assembly> GetAssemblies()
{
var list = new List<string>();
var stack = new Stack<Assembly>();
stack.Push(Assembly.GetEntryAssembly());
do
{
var asm = stack.Pop();
yield return asm;
foreach (var reference in asm.GetReferencedAssemblies())
if (!list.Contains(reference.FullName))
{
stack.Push(Assembly.Load(reference));
list.Add(reference.FullName);
}
}
while (stack.Count > 0);
}
你有什么建议吗?
【问题讨论】:
-
您是说要动态加载程序集吗?如果是这样,程序集将不会出现在 AppDomain 中。您可以使用 Assembly.Load() 从磁盘加载 DLL 文件。
-
Assembly.Load() 将需要一个路径,我不想在我的代码中硬编码任何东西。你能告诉我如何在不指定路径的情况下实现这一点吗?
-
如果不指定路径,它就不会知道文件的位置。如果没有硬编码,您可以将位置放在 App.config 文件中,因此 DLL 位置是可变的。
-
但在 App.Config 中我还需要输入硬代码路径,我认为这在其他机器上不起作用。如果我在这里错了,请纠正我?
-
也许您可以明确说明您想要做什么?
标签: reflection assembly-loading