3

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

我的应用程序的结构如下:

项目1:

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(参考项目1):

    [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 语句中没有产生任何插件。

ps:所有.dll都编译在同一个目录下。

4

2 回答 2

5

这里的问题是 IOrganizerPlugin 的扩展点是在 project1 中定义的,它既不是插件也不是插件根。解决方案是在project2中添加这个引用:

[程序集:ImportAddinAssembly(“project1.dll”)]

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

于 2012-11-16T18:41:26.340 回答
0

不知道为什么或是否有一些实现原因,但是将专用插件接口(IOrganizerPlugin)移动到与插件主机相同的程序集中对我有用。

于 2012-11-16T15:51:47.233 回答