Writing an Addin or Plugin Framework in C#

笑着哭i 提交于 2019-12-03 15:25:05

You might want to look at Mono.Addins. There are some good looking samples here, Here are some of the details:.

The following code is a basic example of an add-in host application. This application runs a set of commands which can be implemented by add-ins:

using System;
using Mono.Addins;

[assembly:AddinRoot ("HelloWorld", "1.0")]

class MainClass
{
    public static void Main ()
    {
        AddinManager.Initialize ();
        AddinManager.Registry.Update ();

        foreach (ICommand cmd in AddinManager.GetExtensionObjects<ICommand> ())
            cmd.Run ();
    }
}

The extension point for the above example can be declared like this:

using Mono.Addins;

[TypeExtensionPoint]
public interface ICommand
{
    void Run ();
}

An add-in extending the above extension point would look like this:

using System;
using Mono.Addins;

[assembly:Addin]
[assembly:AddinDependency ("HelloWorld", "1.0")]

[Extension]
public class HelloCommand: ICommand
{
    public void Run ()
    {
        Console.WriteLine ("Hello World!");
    }
}
cdiggins

Dynamically Loading Plug-ins / Add-ins

You didn't explicitly ask how to dynamically load add-in or plug-ins, but you can see this question (and my answer) on StackOverflow.com on how to do so.

Unloading Plug-ins and Add-ins

There is only one way that I am aware of to unload dynamically loaded plug-ins and add-ins: by loading the add-in in a separate AppDomain and unloading the AppDomain. For more information see this article on MSDN.

Existing Add-in / Plug-in Frameworks

Why reinvent something that already exists? I know of two plug-in frameworks.

Some people talk about the Managed Extensibility Framework (MEF) as a plug-in or add-in framework, which it isn't. For more information see this StackOverflow.com question and this StackOverflow.com question.

There are two parts to "unloading" an add-in.

  1. Unregister the addin so it is not "connected" to your program (it is not hooked up to any events, holding any resource locks, is not needed by or called by the main program at any time, and is not actively running any code).

  2. Unload the assembly containing the addin code.

The first part is entirely in your control - if your addin subscribes to an event, then when you ask it to shut down it must unsubscribe. If your program creates buttons and menu items for the addin, then it must know about them and be able to remove them when the addin shuts down. etc.

It is up to you to decide whether the addin is responsible for this (in which case a rogue addin could take down the entire application if it doesn't clean up properly), or whether the addin framework must provide mechanisms for connecting to the main application so that it is able to clean up all the links between the app and addin automatically (i.e. run the addin in a safer "sandbox" where it is less able to adversely affect the stability of the application or other addins).

Once the addin is shut down it becomes totally dormant, and then it will be safe to unload it. (However, unless you want to be able to update the addin dll while the program is running, you may find you don't even need to unload the addin - simply disabling it may achieve your needs)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!