MAF 项目创建流程

本文档详细介绍了如何使用.NET Framework的Managed Add-In Framework(MAF)创建一个插件系统。从创建空项目开始,逐步讲解了创建Application项目、定义合同类、实现插件抽象类和主机抽象类、构建插件和主机适配器,到最后创建具体的插件实例,整个过程涵盖了MAF框架的关键步骤。此外,还提到了项目间的引用设置和输出目录配置,确保所有组件能正确交互。
摘要由CSDN通过智能技术生成

1、创建空项目

2、创建 Appliction 项目

【MAF.AddInApplication】

前台代码

<Window x:Class="MAF.AddInApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MAF.AddInApplication"
        mc:Ignorable="d"
        Title="MainWindow" Height="550" Width="1000">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>

        <Border Background="#F7F9FA"/>
        <ListBox Name="lsAddIn">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Margin="3" Background="#EEE">
                        <TextBlock Text="{Binding Name}" FontWeight="Bold"/>
                        <TextBlock Text="{Binding Pulisher}"/>
                        <TextBlock Text="{Binding Description}"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Grid Grid.Column="1">
            <Grid.RowDefinitions>
                <RowDefinition Height="50"/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
                <Button Content="刷新" Width="90" Height="30" Margin="10 0 0 0" Click="Button_Click"/>
                <Button Content="获取插件视图" Width="90" Height="30" Margin="10 0 0 0" Click="Button_Click_1"/>
            </StackPanel>

            <ContentControl Grid.Row="1" Name="mainContentContainer"></ContentControl>
        </Grid>
    </Grid>
</Window>

3、合同类实现(Contract)

【MAF.AddInApplication】

创建合同接口类 IOperationContrac。(需要添加 [AddInContract] 特性)

using System;
using System.AddIn.Contract;
using System.AddIn.Pipeline;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.Contract
{
    [AddInContract]
    public interface IOperationContract : IContract
    {
        //甲方提供的合同接口
        int Process();
    }
}

4、插件抽象类实现(AddInView)

【MAF.AddInView】

using System;
using System.AddIn.Pipeline;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.AddInView
{
    [AddInBase]
    public abstract class OperationAddInView
    {
        //乙方需要履行的义务【方法名不一定相同,可以通过适配器建立两者的联系】
        public abstract int ProcessNumber();
    }
}

5、Host 抽象类实现(OperationHostView)

【MAF.OperationHostView】'

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.OperationHostView
{
    public abstract class OperationHostView
    {
        public abstract int ProcessNumber();
    }
}

6、插件适配器(AddInSideAdapter)

【MAF.AddInSideAdapter】'

using MAF.AddInView;
using MAF.Contract;
using System;
using System.AddIn.Pipeline;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.AddInSideAdapter
{
    [AddInAdapter]
    public class OperationAddInAdapter : ContractBase, IOperationContract
    {
        private OperationAddInView view;

        public OperationAddInAdapter(OperationAddInView view)
        {
            this.view = view;
        }

        public int ProcessNumber()
        {
            return view.ProcessNumber();
        }
    }
}

6、Host 适配器(HostAdapter)

【MAF.OperationHostAdapter】

用于解决 Host 主类型与合同类的关系

using MAF.Contract;
using MAF.OperationHostView;
using System;
using System.AddIn.Pipeline;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.OperationHostAdapter
{
    [HostAdapter]
    public class OperationHostAdapter: OperateHostView
    {
        private IOperationContract contract;
        private ContractHandle contractHandle;

        public OperationHostAdapter(IOperationContract contract)
        {
            this.contract = contract;
            //防止合同接口在初始化完成后被释放,用于管理接口的生命周期
            this.contractHandle = new ContractHandle(contract);
        }

        public override int ProcessNumber()
        {
            return contract.ProcessNumber();
        }
    }
}

7、创建插件 A(ProcessA)

【MAF.ProcessA】

using MAF.AddInView;
using System;
using System.AddIn;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MAF.ProcessA
{
    /*
     * 1、继承插件抽象类【MAF.AddInView】
     * 2、设定插件特性【[AddIn("第一个插件", Version = "1.0", Publisher = "MAF", Description = "插件 MAF Demo")]】
     */
    [AddIn("第一个插件", Version = "1.0", Publisher = "MAF", Description = "插件 MAF Demo")]
    public class ProcessA : OperationAddInView
    {
        public override int ProcessNumber()
        {
            return 100;
        }
    }
}

8、引用设置

将各个项目间相互引用的 dll,杂项属性中的 ”复制本地“ 设置为 false

9、设定输出目录

【MAF.AddInApplication】-- 【../output】

【MAF.OperationHostView】-- 【../output】

【MAF.OperationHostAdapter】 -- 【../output/HostSideAdapters】

【MAF.Contract】 -- 【../output/Contracts】

【MAF.AddInSideAdapter】 -- 【../output/AddInSideAdapters】

【MAF.AddInView】 -- 【../output/AddInViews】

【MAF.ProcessA】 -- 【../output/AddIns/MAF.ProcessA】

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值