Mono.Addin实现不检索插件

时间:2012-11-16 13:05:27

标签: c# plugins mono.addins

我正在使用Mono.Addins框架,C#和visual studio 2010编写一个可扩展的应用程序。

我的申请结构如下:

PROJECT1:

namespace Plugins
{
    [TypeExtensionPoint]
    public interface IPlugin<InitParamsType>
    {
        void Refresh();

        string PlugInName { get; }

        void Initialize(InitParamsType parameters);
    }

    [TypeExtensionPoint]
    public interface IOrganizerPlugin : IPlugin<string>
    {
        bool AllowsToEditBrandCode { get; }

        UserControl GetUI();
    }

    public interface IPluginHost<PluginSpecalizedType>
    {
        void EmbedPlugin(PluginSpecalizedType plugin);
    }
}

项目2(参考project1):

    [assembly: AddinRoot("App.Organizer", "1.0")]
namespace App.Organizer
{
    public partial class frm_Supplier_Managed : Form, IPluginHost<IOrganizerPlugin>
        {

        public frm_Supplier_Managed()
        {
                 AddinManager.Initialize();
                AddinManager.Registry.Update(null);

                foreach (IOrganizerPlugin Addin in AddinManager.GetExtensionObjects(typeof(IOrganizerPlugin)))
                {
                    EmbedPlugin(Addin);
                }
         }


        public void EmbedPlugin(IOrganizerPlugin plugin)
        {
           //embedding UI and so on..
        }
        }
 }

项目3(参考项目1):

[assembly: Addin("App.OrganizerPro", "1.0")]
[assembly: AddinDependency("App.Organizer", "1.0")]

namespace App
{
    [Extension]
    public class MainPlugIn : IOrganizerPlugin
    {
        public void Refresh()
        {
            return;
        }

        public string PlugInName
        {
            get { return ""; }
        }

        public void Initialize(string supplierCode)
        {
        }

        public UserControl Interface
        {
            get { return null; }
        }

        public bool AllowsToEditBrandCode
        {
            get { return true; }
        }

        public UserControl GetUI()
        {
            return null;
        }
    }
}

问题是: 在foreach语句中没有插件。

p.s。:所有.dll都编译在同一目录中。

2 个答案:

答案 0 :(得分:5)

这里的问题是IOrganizerPlugin的扩展点是在project1中定义的,它不是addin,也不是加载项root。解决方案是在project2中添加此引用:

[assembly:ImportAddinAssembly(“project1.dll”)]

这样,project1成为App.Organizer加载项根目录的一部分,project1.dll中的扩展点将被正确注册。

答案 1 :(得分:0)

不知道为什么或者是否有一些实现原因,但是在插件主机为我工作的同一个程序集中移动专用插件接口(IOrganizerPlugin)。