我的项目是这样设置的:
项目“消费者”同时引用了“定义”和“实施”,但没有静态引用“实施”中的任何类型。
当应用程序启动时,“消费者”项目将在“定义”中调用静态方法,该方法需要在“实施”中查找类型。
有没有一种方法可以强制将任何引用的程序集加载到App Domain中,而无需知道路径或名称,最好是不必使用完整的IOC框架?
这似乎可以解决问题:
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)具有更好的工具来完成这样的事情。