[英]C# get unreferenced assemblies
我正在开发一个带有类似系统插件的项目。 项目结构定义如下:
- Solution
- Project A (Cli)
- Project B (Core logic)
- Project C (Plugin)
Project A
是启动项目, Project B
包含核心逻辑, Project C
是一个插件,它在project B
实现了一个接口。 Project A
仅引用了Project B
而Project C
仅引用了Project B
。
由于我没有从Project B
引用Project C
(并且不直接实例化类),像AppDomain.CurrentDomain.GetAssemblies()
(在Project B
)这样的代码不会返回Project C
但是,一旦我这样做(来自Project B
): var MyImplementation = new MyImplementation()
, AppDomain.CurrentDomain.GetAssemblies()
确实返回程序集,因为它是已知的并在运行时加载,因为我从代码中显式实例化了MyImplementation
类。
从Project B
,我想它实现从特定接口的所有组件Project B
和实例化它们。
那么,如何让这些(看似)未知的程序集在运行时加载?
我认为不可能知道程序集是否包含实现您的接口的类而不加载它。
您可以做的是提供一个目录,您可以在其中放置所有插件程序集。
所以你可以像这样在你的 AppDomain 中加载你的插件:
public static Assembly[] MyPlugins { get; private set; }
public static void LoadAssemblies()
{
MyPlugins = Directory.GetFiles(lookingDirectory, "*.dll")
.Select(assemblyPath =>
{
AssemblyName an = AssemblyName.GetAssemblyName(assemblyPath);
return Assembly.Load(an);
})
.ToArray();
}
然后你可以找到所有实现你的接口的类型,如下所示:
MyPlugins.SelectMany(assembly => assembly.GetTypes())
.Where(type => typeof(IYourInterface).IsAssignableFrom(type))
.Select(type => (IYourInterface)Activator.CreateInstance(type))
然后您可以迭代接口的每个实现以调用共享方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.