我的项目设置如下:
Consumer项目同时引用了Definition和Implementation,但在Implementation中没有静态引用任何类型。
当应用程序启动时,项目"Consumer“调用”定义“中的静态方法,该方法需要在”实现“中查找类型。
有没有一种方法可以在不知道路径或名称的情况下强制将任何引用的程序集加载到App Domain中,并且最好不必使用成熟的IOC框架?
发布于 2010-03-05 13:05:15
这似乎起到了作用:
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToList();
var loadedPaths = loadedAssemblies.Select(a => a.Location).ToArray();
var referencedPaths = Directory.GetFiles(AppDomain.CurrentDomain.BaseDirectory, "*.dll");
var toLoad = referencedPaths.Where(r => !loadedPaths.Contains(r, StringComparer.InvariantCultureIgnoreCase)).ToList();
toLoad.ForEach(path => loadedAssemblies.Add(AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(path))));
正如Jon所指出的,理想的解决方案需要递归到每个已加载程序集的依赖项中,但在我的特定场景中,我不必担心这一点。
更新: .NET 4中包含的托管可扩展性框架(System.ComponentModel)提供了更好的工具来实现这样的功能。
发布于 2010-03-05 12:44:10
您可以使用Assembly.GetReferencedAssemblies
获取一个AssemblyName[]
,然后对每个an调用Assembly.Load(AssemblyName)
。当然,您需要递归-但最好跟踪您已经加载的程序集:)
发布于 2014-10-04 18:35:49
只是想分享一个递归的例子。我在启动例程中调用LoadReferencedAssembly方法,如下所示:
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
this.LoadReferencedAssembly(assembly);
}
这是递归方法:
private void LoadReferencedAssembly(Assembly assembly)
{
foreach (AssemblyName name in assembly.GetReferencedAssemblies())
{
if (!AppDomain.CurrentDomain.GetAssemblies().Any(a => a.FullName == name.FullName))
{
this.LoadReferencedAssembly(Assembly.Load(name));
}
}
}
https://stackoverflow.com/questions/2384592
复制相似问题