繁体   English   中英

C# 获取未引用的程序集

[英]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 BProject 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM