مشاركة عبر


الإرشادات التفصيلية: تمكين توافق مع الإصدارات السابقة كتغييرات مضيف الخاص بك

Th هو تصف معاينة للإصدار 2 من خط أنابيب التي هو في الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع. يتضمن الإصدار 2 المزيد من الميزات الحساب بواسطة توفير سلسلة العمليات الحسابية التي يعتمدها المفصول بفواصل إلى مضيف. ثم يمكنك اختيار عملية مضيف وتقديم معادلة إضافة-في حساب.

يحتوي خط أنابيب مضيف جديد وجديد اتفاق. لتمكين الإصدار 1 من إضافة-في التعامل مع المضيف الجديد والعقد، ويحتوي خط أنابيب إضافة-في طريقة العرض المستخدمة للإصدار 1 إضافة-في-محول الجانب يقوم بتحويل بيانات من الأقدم إضافة-لعقد جديد في طريقة العرض. يبين المثال التالي كيفية كلا إضافة-يمكن لأدوات العمل مع نفس مضيف.

المضيف الجديد القديم إضافة-زر 'Ins'

سيناريو التدفقات: مضيف جديد، وظائف إضافية قديمة.

Th هو أنابيب هو كما هو موضح في إضافة-في وحدات سيناريو خط أنابيب.

This معاينة describes the following tasks:

  • Creating a ‏‫Visual Studio الحل.

  • Creating the pipeline الدليل بنية.

  • Creating the اتفاق و طرق العرض.

  • إنشاء إضافة--جانب المحول، والتي تتضمن محولات للإصدار الجديد من إضافة-في والإصدار 1 إضافة-في.

  • Creating the مضيف-side محول.

  • Creating the مضيف.

  • Creating the إضافة-في.

  • Deploying the pipeline.

  • تشغيل the تطبيق مضيف.

توضح معاينة أيضا باستخدام فئات أساسية مجردة إلى تعريف طرق العرض والعروض التي تتوافق مع طرق العرض التي تم تعريفها بواسطة واجهات طرق العرض هذه. استخدام واجهات هو الموصى بها.

ملاحظةملاحظة

بعض من التعليمة البرمجية في هذه معاينة يحتوي على مراجع مساحة الاسم غير الضرورية.يعكس الخطوات معاينة بدقة المراجع المطلوبة في ‏‫Visual Studio.

You can بحث إضافى نموذج تعليمات برمجية, و العميل التقنية previews of أدوات for إنشاء? إضافة-في pipelines, at the مدارة التوافق مع البرامج الخارجية و إضافة-في Framework موقع تشغيل CodePlex.

المتطلبات الأساسية

تحتاج إلى المكونات التالية لاستكمال هذه الإرشادات التفصيلية:

Creating a ‏‫Visual Studio الحل

استخدم a الحل في Visual Studio إلى contain the مشاريع of your pipeline segments.

إلى إنشاء the pipeline الحل

  1. في Visual Studio، قم بإنشاء مشروع جديد باسم من Calc2Contract. الأساس it تشغيل the فئة مكتبة قالب.

  2. قم بتسمية الحل من CalculatorV2.

Creating the Pipeline الدليل بنية

The إضافة-في model يتطلب the pipeline segment تجميعات إلى be placed في a specified الدليل بنية.

إلى إنشاء the pipeline الدليل بنية

  • إذا لم تقم بذلك مسبقاً، يتم إضافة CalcV2مجلد إلى بنية المجلد الذي تم إنشاؤه في خط أنابيب الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع. CalcV2مجلد سيتم الاحتفاظ بالإصدار الجديد من الوظيفة-بوصة

    Pipeline
      AddIns
        CalcV1
        CalcV2
      AddInSideAdapters
      AddInViews
      Contracts
      HostSideAdapters
    

    ليس من الضروري وضع بنية المجلد خطوط الأنابيب في مجلد التطبيقات الخاص بك؛ وكان القيام بذلك فقط للراحة في هذه walkthroughs. إذا قمت بوضع بنية المجلد الخاص بك بخط أنابيب في مكان آخر في معاينة أول، اتبع نفس نقش لهذه معاينة. راجع متطلبات الدليل خطوط الأنابيب في متطلبات تطوير خط أنابيب.

إنشاء طرق عرض و اتفاق

يعرف المقطع اتفاق لخط الأنابيب هذا ICalc2Contractالواجهة، والذي يحتوي على الأساليب الثاني التالية:

  • GetAvailableOperationsالأسلوب.

    هذا الأسلوب بإرجاع سلسلة من العمليات الحسابية التي إضافة-في اعتماد إلى مضيف. يدعم الإصدار 2 خمس العمليات، و هذا الأسلوب بإرجاع السلسلة " +,-,*,/,**"الموقع"**" يمثل Powتشغيل.

    في إضافة-في وطرق العرض للمضيف، تسمى هذه الطريقة Operationsبدلاً من GetAvailableOperations.

    يمكن تعريض وظائف تشغيل اتفاق كخصائص تشغيل طرق العرض بواسطة تحويل استدعاء الأسلوب في خاصية تشغيل محول.

  • Operateالأسلوب.

    مضيف باستدعاء هذا الأسلوب بإرسال معادلة إضافة-في حساب وإرجاع النتيجة.

إلى إنشاء اتفاق

  1. في ‏‫Visual Studio الحل باسم من CalculatorV2، افتح مشروع Calc2Contract.

  2. في مستكشف الحلول، إضافة مراجع للتجميعات التالية إلى مشروع Calc2Contract:

    النظام.AddIn.اتفاق.dll

    النظام.AddIn.dll

  3. فئة استثناء الافتراضي في من مستكشف الحلول، التي هو إضافة إلى مشاريع مكتبة فئة الجديدة.

  4. إضافة عنصر جديد? إلى المشروع، وذلك باستخدام القالب واجهة. في صندوق الحوار إضافة عنصر جديد? ، قم بتسمية واجهة من ICalc2Contract.

  5. في الواجهة ملف، قم بإضافة مساحة الاسم مراجع System.AddIn.Contractو System.AddIn.Pipeline.

  6. تستخدم التعليمة البرمجية التالية إلى إتمام المقطع اتفاق. لاحظ أن هذا واجهة يجب أن يكون AddInContractAttributeالسمة.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn.Contract
    Imports System.AddIn.Pipeline
    
    Namespace CalculatorContracts
        <AddInContract()> _
        Public Interface ICalc2Contract
            Inherits IContract
            Function GetAvailableOperations() As String
            Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) As Double
        End Interface
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.AddIn.Contract;
    using System.AddIn.Pipeline;
    
    namespace CalculatorContracts
    {
        [AddInContract]
        public interface ICalc2Contract : IContract
        {      
            string GetAvailableOperations();
            double Operate(String operation, double a, double b);
        }
    }
    

لأن إضافة-في طريقة عرض مضيف ونفس تعليمات برمجية، يمكنك بسهولة إنشاء طرق العرض في نفس الوقت. تختلف بواسطة عامل واحد فقط: إضافة-في طريقة العرض يتطلب AddInBaseAttributeالسمة؛ عرض المضيف إضافة-في لا يتطلب أية السمات.

لإنشاء إضافة-في طريقة العرض للإصدار 2

  1. إضافة مشروع جديد باسم Calc2إضافةInView إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. في مستكشف الحلول، إضافة مرجع إلى النظام.إضافةIn.dll إلى مشروع Calc2إضافةInView.

  3. إعادة تسمية فئة من Calculator2.

  4. في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.

  5. جعل Calculator2 abstractفئة ( MustInheritفئة في Visual أساسى).

  6. استخدم تعليمات برمجية التالية لهذا إضافة-في طريقة العرض. لاحظ أن هذا فئة يجب أن يكون AddInBaseAttributeالسمة.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn.Pipeline
    
    Namespace CalcAddInViews
        <AddInBase()> _
        Public MustInherit Class Calculator2
            Public MustOverride ReadOnly Property Operations() As String
    
            Public MustOverride Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) As Double
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.AddIn.Pipeline;
    
    namespace CalcAddInViews
    {
        [AddInBase]
        public abstract class Calculator2
        {
            public abstract string Operations
            {
                get;
            }
    
            public abstract double Operate(string operation, double a, double b);
        }
    }
    

لإنشاء عرض المضيف إضافة-في

  1. إضافة مشروع جديد باسم Calc2HVA إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. قم بإعادة تسمية الفئة آلة حاسبة.

  3. جعل من آلة حاسبة abstractفئة ( MustInheritفئة في Visual أساسى).

  4. في الملف فئة، استخدم تعليمات برمجية التالية لإنشاء طريقة عرض للمضيف إضافة-في.

    Imports Microsoft.VisualBasic
    Imports System
    Namespace CalcHVAs
    
        Public MustInherit Class Calculator
    
            Public MustOverride ReadOnly Property Operations() As String
    
            Public MustOverride Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) As Double
        End Class
    End Namespace
    
    namespace CalcHVAs {
    
    
        public abstract class Calculator {
    
            public abstract string Operations
            {
                get;
            }
    
            public abstract double Operate(string operation, double a, double b);
        }
    }
    

لتوضيح استخدام الإصدار 1 إضافة-في مضيف الجديد، يجب أن يتضمن الحل إضافة-في عرض التي تم إنشاؤها للإصدار 1 من آلة حاسبة إضافة-في.

إلى إضافة الوظيفة-في طريقة العرض للمشروع من الإصدار 1

  1. في من مستكشف الحل، انقر نقراً مزدوجاً فوق CalculatorV2 الحل.

  2. إضافة، انقر و ثم انقر فوق مشروع الموجود.

  3. انتقل إلى المجلدات التي تحتوي على " CalculatorV1 الحل و حدد ملف مشروع للمشروع Calc1AddInView.

إنشاء محول إضافة في-جانب

يتكون هذا المحول إضافة في-جانب من محولين view-إلى-اتفاق: للتكيف مع الإصدار 2 الوظيفة الإضافية العرض إلى الإصدار 2 اتفاق، والآخر التكيف مع الإصدار 1 وظيفة إضافية العرض إلى الإصدار 2 اتفاق.

في this pipeline, the إضافة-في provides a الخدمة إلى the مضيف, و the أنواع تدفق من the إضافة-في إلى the مضيف. لأنه لا يوجد أنواع التدفق من مضيف إضافة-في، لم يكن لديك لتضمين محول العرض للعقد.

إلى إنشاء the إضافة-في-side محول

  1. إضافة مشروع جديد باسم Calc2إضافةInSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. في مستكشف الحل، إضافة مراجع تجميعات التالية إلى مشروع Calc2إضافةInSideAdapter:

    النظام.AddIn.dll

    النظام.AddIn.اتفاق.dll

  3. قم بإضافة مراجع مشروع? على مشاريع التالية:

    Calc2AddInView

    Calc2Contract

  4. تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. The تجميعات will be located في the pipeline الدليل, كـ described في the "Deploying the Pipeline" إجراء later في this معاينة. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.

  5. إعادة تسمية the مشروع's الافتراضي فئة CalculatorViewToContractAddInSideAdapter.

  6. في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.

  7. في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcAddInViews و CalculatorContracts. (في Visual أساسى, these مساحة الاسم مراجع are Calc2AddInView.CalcAddInViews و Calc2Contract.CalculatorContracts, unless you have turned إيقاف the الافتراضي مساحات الاسم في your Visual أساسى مشاريع.)

  8. استخدم the following تعليمات برمجية for this إضافة-في-side محول. The implementation نقش هو similar إلى the إضافة-في-side محول for الإصدار 1, although the اتفاق واجهة هو very different.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn.Pipeline
    Imports System.AddIn.Contract
    Imports Calc2Contract.CalculatorContracts
    Imports Calc2AddInView.CalcAddInViews
    
    Namespace CalculatorContractsAddInAdapters
    
        <AddInAdapterAttribute()> _
        Public Class CalculatorViewToContractAddInAdapter
            Inherits ContractBase
            Implements ICalc2Contract
    
            Private _view As Calculator2
    
            Public Sub New(ByVal calculator As Calculator2)
                _view = calculator
            End Sub
    
            Public Function GetAvailableOperations() As String Implements ICalc2Contract.GetAvailableOperations
                Return _view.Operations
            End Function
    
            Public Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) As Double Implements ICalc2Contract.Operate
                Return _view.Operate(operation, a, b)
            End Function
        End Class
    End Namespace
    
    using System.AddIn.Pipeline;
    using CalcAddInViews;
    using CalculatorContracts;
    
    
    namespace CalcAddInSideAdapters {
    
    
        [AddInAdapterAttribute]
        public class CalculatorViewToContractAddInAdapter : ContractBase, ICalc2Contract {
    
            private Calculator2 _view;
    
            public CalculatorViewToContractAddInAdapter(Calculator2 calculator)
            {
                _view = calculator;
            }
    
            public string GetAvailableOperations()
            {
                return _view.Operations;
            }
    
            public double Operate(string operation, double a, double b)
            {
                return _view.Operate(operation, a, b);
            }
    
        }
    }
    

إلى تمكين الإصدار 1 of the إضافة-في إلى communicate مع the جديد مضيف, the pipeline for the الإصدار 1 إضافة-في يتطلب an إضافة-في-side محول that converts بيانات من the old إضافة-في عرض إلى the جديد اتفاق.

إلى إنشاء the الإصدار 1 إلى الإصدار 2 إضافة-في-side محول

  1. إضافة مشروع جديد باسم Calc2V1toV2إضافةInSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. في مستكشف الحلول، إضافة مراجع للتجميعات التالية إلى مشروع Calc2V1toV2AddInSideAdapter:

    النظام.AddIn.dll

    النظام.AddIn.اتفاق.dll

  3. قم بإضافة مراجع مشروع? على مشاريع التالية:

    Calc1AddInView

    Calc2Contract

  4. تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.

  5. قم بإعادة تسمية مشروع الافتراضي فئة من Calc2V1ViewToV2ContractAddInSideAdapter.

  6. في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.

  7. في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcAddInViews و CalculatorContracts. (في Visual أساسى هذه المراجع مساحة الاسم هي Calc1AddInView.CalcAddInViews و Calc2Contract.CalculatorContracts ، إلا إذا كنت قمت بتشغيل إيقاف مساحات الاسم الافتراضية في مشاريعك Visual أساسى.) لاحظ أنه يتم عرض مساحة الاسم من الإصدار 1 و اتفاق من الإصدار 2.

  8. يطبق AddInAdapterAttributeالسمة Calc2V1ViewToV2ContractإضافةInSideAdapter فئة لتعريفه إضافة-في-جانب محول.

  9. جعل الفئة Calc2V1ViewToV2ContractAddInSideAdapter يورث ContractBase، الذي يوفر الافتراضي تطبيق IContractالواجهة، ويقوم بتطبيق واجهة اتفاق 2 الإصدار لخط أنابيب، من ICalc2Contract.

  10. إضافة على الدالة الإنشائية عام يقبل ICalculator، بالتخزين المؤقت في حقل خاص، وقم باستدعاء الدالة الإنشائية فئة Base.

  11. لتطبيق الأعضاء من ICalc2Contract، يجب استدعاء أعضاء المثيل ICalculator المناسبة التي هو التي تم تمريرها إلى المنشئ، وإرجاع نتائج. نظراً للاختلافات بين الإصدار 1 والإصدار 2 عقد الواجهات، يجب أن يكون لديك switchعبارة ( Select Caseعبارة في Visual أساسى) إلى التكيف مع عرض ( من ICalculaإلىr) إلى اتفاق ( من ICalc2Contract).

    يلي تعليمات برمجية يظهر محول إضافة في-جانب المكتملة.

    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn.Pipeline
    Imports Calc1AddInView.CalcAddInViews
    Imports Calc2Contract.CalculatorContracts
    
    Namespace AddInSideV1toV2Adapter
    
    
        <AddInAdapter()> _
        Public Class Calc2V1ViewToV2ContractAddInSideAdapter
            Inherits ContractBase
            Implements ICalc2Contract
    
            Private _view As ICalculator
    
            Public Sub New(ByVal calc As ICalculator)
                MyBase.New()
                _view = calc
            End Sub
    
            Public Function GetAvailableOperations() As String Implements ICalc2Contract.GetAvailableOperations
                Return "+, -, *, /"
            End Function
    
            Public Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) _
             As Double Implements ICalc2Contract.Operate
                Select Case (operation)
                    Case "+"
                        Return _view.Add(a, b)
                    Case "-"
                        Return _view.Subtract(a, b)
                    Case "*"
                        Return _view.Multiply(a, b)
                    Case "/"
                        Return _view.Divide(a, b)
                    Case Else
                        Throw New InvalidOperationException(("This add-in does not support: " + operation))
                End Select
            End Function
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.AddIn.Pipeline;
    using CalcAddInViews;
    using CalculatorContracts;
    
    
    namespace AddInSideV1toV2Adapter
    {
        [AddInAdapter]
        public class Calc2V1ViewToV2ContractAddInSideAdapter : ContractBase, ICalc2Contract
        {
            ICalculator _view;
    
            public Calc2V1ViewToV2ContractAddInSideAdapter(ICalculator calc)
            {
                _view = calc;
            }
    
            public string GetAvailableOperations()
            {
                return  "+, -, *, /" ;
            }
    
            public double Operate(string operation, double a, double b)
            {
                switch (operation)
                {
                    case "+":
                        return _view.Add(a, b);
                    case "-":
                        return _view.Subtract(a, b);
                    case "*":
                        return _view.Multiply(a, b);
                    case "/":
                        return _view.Divide(a, b);
                    default:
                        throw new InvalidOperationException("This add-in does not support: " + operation);
                }
            }
    
        }
    }
    

قم بإنشاء مضيف من الجانب محول

يتكون هذا المحول مضيف من جانب واحد من اتفاق-إلى-عرض محول. محول واحد للعقد لعرض هو كافية لاعتماد كلا الإصدارين من الوظيفة الإضافية، لأن تحويل كل محول الوظيفة في جانب من عرض الخاصة به إلى اتفاق الإصدار 2.

في خط أنابيب، إضافة-توفير الخدمة مضيف وتدفق أنواع من إضافة-في إلى مضيف. لأنه لا يوجد أنواع التدفق من مضيف إلى الوظيفة الإضافية، لم يكن لديك لتضمين طريقة عرض-إلى-اتفاق محول.

لتطبيق إدارة مدة بقاء، استخدم ContractHandleالكائن بإرفاق رمز مميز عمر إلى اتفاق. يجب أن تضع مرجع إلى هذا المؤشر من أجل إدارة عمر إلى العمل. بعد الرمز المميز هو تطبيق، لا يوجد برمجة إضافى هو المطلوبة لأن النظام الوظيفة الإضافى يمكنك dهوpose الكائنات عند أنها لم تعد مستخدمة وجعلها متوفرة لمجموعة البيانات المهملة. لمزيد من المعلومات، راجع إدارة مدة بقاء.

لإنشاء الجانب مضيف محول

  1. إضافة مشروع جديد باسم Calc2HostSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. في مستكشف الحل، إضافة مراجع تجميعات التالية إلى مشروع Calc2HostSideAdapter:

    النظام.AddIn.dll

    النظام.AddIn.اتفاق.dll

  3. قم بإضافة مراجع مشروع? على مشاريع التالية:

    Calc2Contract

    Calc2HVA

  4. تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.

  5. قم بإعادة تسمية مشروع الافتراضي فئة من CalculatorContractToViewHostSideAdapter.

  6. في الملف فئة، إضافة مساحة اسم المراجع إلى System.AddIn.Pipeline.

  7. في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcHVAs و من CalculatorContracts. (في Visual أساسى، هذه المراجع مساحة الاسم هي Calc2HVA.CalcHVAs و Calc2Contract.CalculatorContracts ، إلا إذا توقف تشغيل مساحات الاسم الافتراضية في مشاريعك Visual أساسى.)

  8. يطبق HostAdapterAttributeسمة فئة CalculatorContractToViewHostSide محول لتعريفه كجانب مضيف محول.

  9. جعل الفئة CalculatorContractToViewHostSideAdapter ترث الفئة الأساسية مجردة يمثل عرض المضيف إضافة-في: CalcHVAs.آلة حاسبة ( Calc2HVA.CalcHVAs.آلة حاسبة في Visual أساسى). لاحظ الفرق من الموقع عرض مضيف الوظيفة-في الإصدار 1، هو واجهة.

  10. إضافة الكتابة على الدالة الإنشائية عام يقبل عقد خط أنابيب، من ICalc2Contract. الدالة الإنشائية يجب أن ذاكرة التخزين المؤقتة للمرجع للعقد. يجب أيضا إنشاء وتخزين مؤقت جديد ContractHandleللعقد، لإدارة العمر إضافة-بوصة

    ملاحظة هامةهام

    ContractHandleهو هامة لإدارة عمر.إذا فشلت في احتفظ مرجع إلى ContractHandleالكائن، سيتم استرداد مجموعة البيانات المهملة، وسيتم إيقاف تشغيل خط أنابيب أسفل عند البرنامج إلا تتوقع it.يمكن أن يؤدي هذا إلى الأخطاء التي يصعب تشخيص، مثل كـ AppDomainUnloadedException.إيقاف تشغيل هو مرحلة عادية في فترة تواجد خط أنابيب، لذا هو لا توجد طريقة لإدارة عمر التعليمة البرمجية للكشف عن ذلك th هو شرط هو خطأ.

  11. عند يمنع الأعضاء من آلة حاسبة، بساطة استدعاء أعضاء المقابل من ICalc2Contract المثيل الذي تم تمريره الدالة الإنشائية، و إرجاع نتائج. وهذا كلامك اتفاق ( من ICalc2Contract) إلى عرض ( آلة حاسبة).

    إظهار التعليمة البرمجية التالية المقطع المحول مضيف من جانب المكتملة.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn.Pipeline
    Imports Calc2HVA.CalcHVAs
    Imports Calc2Contract.CalculatorContracts
    
    Namespace CalculatorContractsHostAdapers
        <HostAdapter()> _
        Public Class CalculatorContractToViewHostAdapter
            Inherits Calculator
    
        Private _contract As ICalc2Contract
        Private _handle As ContractHandle
    
        Public Sub New(ByVal contract As ICalc2Contract)
            _contract = contract
            _handle = New ContractHandle(contract)
        End Sub
    
        Public Overrides ReadOnly Property Operations() As String
            Get
                Return _contract.GetAvailableOperations()
            End Get
        End Property
    
        Public Overrides Function Operate(ByVal operation As String, ByVal a As Double, ByVal b As Double) As Double
            Return _contract.Operate(operation, a, b)
        End Function
    End Class
    End Namespace
    
    using System.AddIn.Pipeline;
    using CalcHVAs;
    using CalculatorContracts;
    
    namespace CalcHostSideAdapters {
    
    
    [HostAdapter]
    public class CalculatorContractToViewHostAdapter : Calculator {
    
        private CalculatorContracts.ICalc2Contract _contract;
    
        private System.AddIn.Pipeline.ContractHandle _handle;
    
        public CalculatorContractToViewHostAdapter(ICalc2Contract contract) {
            _contract = contract;
            _handle = new System.AddIn.Pipeline.ContractHandle(contract);
        }
    
    
        public override string Operations
        {
            get 
            { 
                return _contract.GetAvailableOperations(); 
            }
        }
    
        public override double Operate(string operation, double a, double b)
        {
            return _contract.Operate(operation, a, b);
        }
     }
    }
    

إنشاء مضيف

تطبيق مضيف يتفاعل مع إضافة-من خلال عرض مضيف. فهو يستخدم إضافة-في أساليب الاكتشاف والتنشيط التي يوفرها في AddInStoreو AddInTokenالفئات للقيام بما يلي:

  • قم بإعادة إنشاء ذاكرة التخزين المؤقت لخطوط الأنابيب و إضافة-في الحصول على المعلومات.

  • بحث إضافة-وظائف من نوع Calculatorتحت الدليل المعين لخط أنابيب الجذر.

  • مطالبة مستخدم بتحديد الذي إضافة-باستخدام. في هذا المثال، سترى الثاني زر 'زر 'Ins'' الإضافية متوفر.

  • تنشيط المحدد إضافة-في مجال تطبيق جديد بمستوى الثقة الأمان معينة.

  • تشغيل the RunCalculator أسلوب, which calls the إضافة-في's وظائف كـ provided بواسطة the مضيف عرض of the إضافة-في.

إلى إنشاء مضيف

  1. إضافة a جديد مشروع named MathHost2 إلى the CalculatorV2 الحل. تستند إلى القالب تطبيق وحدة تحكم به.

  2. في الحل مستكشف, إضافة a مرجع إلى the النظام.AddIn.dll تجميع إلى the MathHost2 مشروع.

  3. قم بإضافة مرجع مشروع إلى Calc2HVAالمشروع. تحديد the مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ, إلى prevent the مشار إليها تجميع من being copied إلى the محلي بنية مجلد. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ .

  4. إعادة تسمية the فئة ملف (وحدة نمطية? في Visual أساسى) MathHost2.

  5. في Visual أساسى، استخدم علامة تبويب التطبيقات من خصائص مشروع صندوق حوار لتعيين كائن بدء التشغيل الرئيسي منخفض .

  6. في الفئة أو وحدة نمطية ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Hosting.

  7. في the فئة أو وحدة نمطية? ملف, إضافة a مساحة الاسم مرجع for the مضيف-عرض of the إضافة-في: CalcHVAs. (في Visual أساسى, this مساحة الاسم مرجع هو Calc2HVA.CalcHVAs, unless you have turned إيقاف the الافتراضي مساحات الاسم في your Visual أساسى مشاريع.)

  8. في من مستكشف الحل، تحديد الحل و اختر خصائص من قائمة مشروع. في صندوق الحوار الحل الصفحات الخاصية ، قم بتعيين مشروع واحد لبدء التشغيل إلى أن هذا مشروع تطبيق مضيف.

  9. استخدم the following تعليمات برمجية إلى إنشاء the تطبيق مضيف.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Collections.ObjectModel
    Imports System.Text
    Imports System.AddIn.Hosting
    Imports Calc2HVA.CalcHVAs
    
    Namespace Mathhost
    
        Module MathHost2
    
            Sub Main()
                ' Assume that the current directory is the application folder, 
                ' and that it contains the pipeline folder structure. 
                Dim pipeRoot As String = Environment.CurrentDirectory & "\Pipeline"
    
                ' Rebuild the cache of pipline and add-in information.
                AddInStore.Rebuild(pipeRoot)
    
                ' Find add-ins of type Calculator under the specified pipeline root directory.
                Dim tokens As Collection(Of AddInToken) = AddInStore.FindAddIns(GetType(Calculator), pipeRoot)
    
                ' Determine which add-in to use.
                Dim calcToken As AddInToken = ChooseCalculator(tokens)
    
                ' Activate the selected AddInToken in a new  
                ' application domain with a specified security trust level.
                Dim calculator As Calculator = calcToken.Activate(Of Calculator)(AddInSecurityLevel.Internet)
    
                ' Run the calculator.
                RunCalculator(calculator)
            End Sub
    
            Private Function ChooseCalculator(ByVal tokens As Collection(Of AddInToken)) As AddInToken
                If tokens.Count = 0 Then
                    Console.WriteLine("No calculators are available")
                    Return Nothing
                End If
                Console.WriteLine("Available Calculators: ")
                ' Show the token properties for each token 
                ' in the AddInToken collection (tokens),
                ' preceded by the add-in number in [] brackets.
    
                Dim tokNumber As Integer = 1
                For Each tok As AddInToken In tokens
                    Console.WriteLine(vbTab & "[{0}]: {1} - {2}" & _
                            vbLf & vbTab & "{3}" & _
                            vbLf & vbTab & "{4}" & _
                            vbLf & vbTab & "{5} - {6}", _
                            tokNumber.ToString, tok.Name, _
                            tok.AddInFullName, tok.AssemblyName, _
                            tok.Description, tok.Version, tok.Publisher)
                    tokNumber = tokNumber + 1
                Next
                Console.WriteLine("Which calculator do you want to use?")
                Dim line As String = Console.ReadLine()
                Dim selection As Integer
                If Int32.TryParse(line, selection) Then
                    If selection <= tokens.Count Then
                        Return tokens(selection - 1)
                    End If
                End If
                Console.WriteLine("Invalid selection: {0}. Please choose again.", line)
                Return ChooseCalculator(tokens)
            End Function
    
            Private Sub RunCalculator(ByVal calc As Calculator)
    
                If calc Is Nothing Then
                    'No calculators were found, read a line and exit
                    Console.ReadLine()
                End If
                Console.WriteLine("Available operations: " & calc.Operations)
                Console.WriteLine("Request a calculation , such as: 2 + 2")
                Console.WriteLine("Type ""exit"" to exit")
                Dim line As String = Console.ReadLine()
                Do While Not line.Equals("exit")
                    ' Parser  
                    Try
                        Dim c As Parser = New Parser(line)
                        Console.WriteLine(calc.Operate(c.action, c.A, c.B))
                    Catch
                        Console.WriteLine("Invalid command: {0}. Commands must be formated: [number] [operation] [number]", line)
                        Console.WriteLine("Available operations: " & calc.Operations)
                    End Try
    
                    line = Console.ReadLine()
                Loop
            End Sub
        End Module
    
    
        Friend Class Parser
    
            Public partA As Double
    
            Public partB As Double
    
            Public action As String
    
            Friend Sub New(ByVal line As String)
                MyBase.New()
                Dim parts() As String = line.Split(" ")
                partA = Double.Parse(parts(0))
                action = parts(1)
                partB = Double.Parse(parts(2))
            End Sub
    
            Public ReadOnly Property A() As Double
                Get
                    Return partA
                End Get
            End Property
    
            Public ReadOnly Property B() As Double
                Get
                    Return partB
                End Get
            End Property
    
            Public ReadOnly Property CalcAction() As String
                Get
                    Return action
                End Get
            End Property
        End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Text;
    using System.AddIn.Hosting;
    using CalcHVAs;
    
    namespace MathHost
    {
        class Program
        {
            static void Main()
            {
                // Assume that the current directory is the application folder, 
                // and that it contains the pipeline folder structure. 
                String addInRoot = Environment.CurrentDirectory + "\\Pipeline";
    
                //Check to see if new add-ins have been installed.
                AddInStore.Rebuild(addInRoot);
    
                //Search for Calculator add-ins.
                Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(Calculator), addInRoot);
    
                //Ask the user which add-in they would like to use.
                AddInToken calcToken = ChooseCalculator(tokens);
    
                //Activate the selected AddInToken in a new
                //application domain with the Internet trust level.
                Calculator calculator = calcToken.Activate<Calculator>(AddInSecurityLevel.Internet);
    
                //Run the add-in.
                RunCalculator(calculator);
            }
    
            private static AddInToken ChooseCalculator(Collection<AddInToken> tokens)
            {
                if (tokens.Count == 0)
                {
                    Console.WriteLine("No calculators are available");
                    return null;
                }
                Console.WriteLine("Available Calculators: ");
                // Show the token properties for each token 
                // in the AddInToken collection (tokens),
                // preceded by the add-in number in [] brackets.
                int tokNumber = 1;
                foreach (AddInToken tok in tokens)
                {
                    Console.WriteLine(String.Format("\t[{0}]: {1} - {2}\n\t{3}\n\t\t {4}\n\t\t {5} - {6}",
                        tokNumber.ToString(), 
                        tok.Name,
                        tok.AddInFullName,
                        tok.AssemblyName,
                        tok.Description,
                        tok.Version,
                        tok.Publisher));
                    tokNumber++;
                }
                Console.WriteLine("Which calculator do you want to use?");
                String line = Console.ReadLine();
                int selection;
                if (Int32.TryParse(line, out selection))
                {
                    if (selection <= tokens.Count)
                    {
                        return tokens[selection - 1];
                    }
                }
                Console.WriteLine("Invalid selection: {0}. Please choose again.", line);
                return ChooseCalculator(tokens);
            }
    
            private static void RunCalculator(Calculator calc)
            {
    
                if (calc == null)
                {
                    //No calculators were found, read a line and exit.
                    Console.ReadLine();
                }
                Console.WriteLine("Available operations: " + calc.Operations);
                Console.WriteLine("Type \"exit\" to exit");
                String line = Console.ReadLine();
                while (!line.Equals("exit"))
                {
                    // The Parser class parses the user's input.
                    try
                    {
                        Parser c = new Parser(line);
                        Console.WriteLine(calc.Operate(c.Action, c.A, c.B));
                    }
                    catch
                    {
                        Console.WriteLine("Invalid command: {0}. Commands must be formated: [number] [operation] [number]", line);
                        Console.WriteLine("Available operations: " + calc.Operations);
                    }
    
                    line = Console.ReadLine();
                }
            }
        }
    
    
        internal class Parser
        {
            internal Parser(String line)
            {
                String[] parts = line.Trim().Split(' ');
                a = Double.Parse(parts[0]);
                action = parts[1];
                b = Double.Parse(parts[2]);
            }
    
            double a;
    
            public double A
            {
                get { return a; }
            }
            double b;
    
            public double B
            {
                get { return b; }
            }
            String action;
    
            public String Action
            {
                get { return action; }
            }
        }
    }
    
    ملاحظةملاحظة

    وهذا تعليمات برمجية تفترض أن بنية المجلد خطوط الأنابيب الموجود في مجلد التطبيقات.إذا قمت بتحديد موقعة من مكان آخر، تغيير الخط تعليمات برمجية الذي يعين addInRootالمتغير، حيث يحتوي المتغير على مسار الخاص بك بنية الدليل خطوط الأنابيب.

Creatفيg إضافة-في

إضافة-في implements الأساليب المحددة إضافة-في عرض. في هذا إضافة-في Operationsالأسلوب بإرجاع سلسلة يسرد العمليات الحسابية التي إضافة-في اعتماد. Operateيوفر الأسلوب تعليمات برمجية لحساب النتيجة استناداً إلى تحديد للمضيف عملية والأرقام الثاني.

لإنشاء إضافة-في

  1. إضافة مشروع جديد يسمى إضافة InCalcV2 إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.

  2. في مستكشف الحل، إضافة مراجع تجميعات التالية إلى إضافة InCalcV2 مشروع:

    النظام.AddIn.dll

    النظام.AddIn.اتفاق.dll

  3. قم بإضافة مرجع مشروع إلى Calc2AddInViewالمشروع. تحديد the مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ, إلى prevent the مشار إليها تجميع من being copied إلى the محلي بنية مجلد. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ .

  4. إعادة تسمية ملف فئة SampleV2AddIn.

  5. في الفئة ملف، قم بإضافة مساحة اسم مراجع System.AddInو System.AddIn.Pipeline. System.AddIn.Pipelineهو مطلوب فقط لأن تعليمات برمجية تتضمن مثالاًQualificationDataAttributeالسمة.

  6. في الملف فئة إضافة مرجع مساحة الاسم للإصدار 2 إضافة-في جزء طريقة العرض: CalcAddInViews ( Calc2AddInView.CalcAddInViews في Visual أساسى).

  7. يطبق AddInAttributeالسمة إلى SampleV2AddInالفئة، لتعريف فئة إضافة-بوصة

  8. يطبق QualificationDataAttributeسمة إلى SampleV2AddInالفئة، ثم قم بتحديد المعلومات التي يمكن استرداد مضيف من AddInToken. في هذه الحالة، يقترح المعلومات التي إضافة-في يجب تحميله في مجال تطبيق الخاص به. انظر كيفية القيام بما يلي: استخدم تأهيل بيانات

  9. جعل SampleV2AddInترث الفئة فئة مجردة الأساسية التي تمثل إضافة-في عرض: Calculator2.

  10. يمنع الأعضاء من Calculator2 و بإرجاع نتائج الحسابات المناسبة.

    إظهار التعليمة البرمجية التالية في إكمال إضافة-في.

    
    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Text
    Imports System.AddIn
    Imports System.AddIn.Pipeline
    Imports Calc2AddInView.CalcAddInViews
    
    Namespace CalculatorAddIns
    ' This pipeline segment has
    ' two attributes:
    ' 1 - An AddInAttribute to identify
    '     this segment as an add-in.
    '
    ' 2 - A QualificationDataAttribute to
    '     indicate that the add-in should
    '     be loaded into a new application domain.
    
    <AddIn("Calculator Add-in", Version:="2.0.0.0")> _
    <QualificationData("Isolation", "NewAppDomain")> _
        Public Class SampleV2AddIn
        Inherits Calculator2
    Public Overrides ReadOnly Property Operations() As String
        Get
            Return "+, -, *, /, **"
        End Get
    End Property
    
    Public Overrides Function Operate(ByVal operation As String, _
            ByVal a As Double, ByVal b As Double) As Double
        Select Case operation
            Case "+"
                Return a + b
            Case "-"
                Return a - b
            Case "*"
                Return a * b
            Case "/"
                Return a / b
            Case "**"
                Return Math.Pow(a, b)
            Case Else
                Throw New InvalidOperationException("This add-in does not support: " & operation)
        End Select
    End Function
    
    End Class
    End Namespace
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.AddIn;
    using System.AddIn.Pipeline;
    using CalcAddInViews;
    namespace CalcAddIns
    {
    // This pipeline segment has
    // two attributes:
    // 1 - An AddInAttribute to identify
    //     this segment as an add-in.
    //
    // 2 - A QualificationDataAttribute to
    //     indicate that the add-in should
    //     be loaded into a new application domain.
    
        [AddIn("Calculator Add-in",Version="2.0.0.0")]
        [QualificationData("Isolation", "NewAppDomain")]
        public class SampleV2AddIn : Calculator2
        {
            public override string Operations
            {
                get
                {
                    return "+, -, *, /, **";
                }
            }
    
            public override double Operate(string operation, double a, double b)
            {
                switch (operation)
                {
                    case "+":
                        return a + b;
                    case "-":
                        return a - b;
                    case "*":
                        return a * b;
                    case "/":
                        return a / b;
                    case "**":
                        return Math.Pow(a, b);
                    default:
                        throw new InvalidOperationException("This add-in does not support: " + operation);
                }
            }
    
        }
    }
    

نشر في خط أنابيب

أنت الآن جاهز إلى إنشاء ونشر مقاطع الوظيفة الإضافية إلى بنية direcإلىry أنابيب المطلوبة.

لنشر القطع على خط أنابيب

  1. For each مشروع في the الحل, استخدم the بنية علامة تبويب of مشروع خصائص (the يحول برمجياً علامة تبويب في Visual أساسى) إلى التعيين the القيمة of the إخراج مسار (the بنية إخراج مسار في Visual أساسى). إذا قمت بتسميته تطبيق المجلد MyApp، على سبيل المثال، سيتم بنية المشاريع في المجلدات التالية:

    Project

    Path

    AddInCalcV2

    MyApp\Pipeline\الوظائف الإضافية\CalcV2

    Calc2AddInSideAdapter

    MyApp\Pipeline\AddInSideAdapters

    Calc2V1toV2AddInSideAdapter

    MyApp\Pipeline\AddInSideAdapters

    Calc1AddInView

    MyApp\Pipeline\AddInViews

    Calc2AddInView

    MyApp\Pipeline\AddInViews

    Calc2Contract

    MyApp\Pipeline\Contracts

    MathHost2

    اسم التطبيق

    Calc2HostSideAdapter

    MyApp\Pipeline\HostSideAdapters

    Calc2HVA

    اسم التطبيق

    ملاحظةملاحظة

    إذا قمت بوضع بنية المجلد خطوط الأنابيب الخاصة بك في الموقع غير ذلك من مجلد التطبيقات الخاص بك، يجب عليك تعديل المسارات التي تظهر في الجدول وفقا لذلك.

  2. بنية the ‏‫Visual Studio الحل.

  3. فحص من تطبيق و pipeline الدلائل، للتأكد من أنه تم النسخ تجميعات إلى الأدلة الصحيحة، و التي لا توجد النسخ إضافية من تجميعات التي تم تثبيتها في المجلدات غير صحيح.

    ملاحظةملاحظة

    في حالة عدم تغيير نسخ محلية ل خطأ ل Calc2AddInViewمشروع مرجع في AddInCalcV2مشروع، إلى منع مشاكل في سياق برنامج تحميل الوظيفة الإضافية من الآن موجود.

    للحصول على المعلومات حول توزيع إلى أنابيب، راجع متطلبات تطوير خط أنابيب.

تشغيل تطبيق مضيف

أنت الآن جاهز لتشغيل مضيف والتفاعل معها إضافة-زر 'Ins'.

إلى تشغيل التطبيق المضيف

  1. تأكد من أن كلا الإصدارين من إضافة-النشر.

  2. في comm و مطالبة، انتقل إلى الدليل تطبيق و تشغيل تطبيق مضيف. في ترتيب هو سبيل المثال، تطبيق مضيف هو من MathHost2.exe.

  3. العثور على مضيف متوفراً على كافة إضافة-وظائف نوعها ويطالبك بتحديد إضافة-في. Enter الزر 1 أو 2.

  4. Enter الزر الزر معادلة للحاسبة، مثل كـ 2 + 2.

  5. نوع إنهاء وضغط المفتاح Enter الزر بإغلاق تطبيق.

  6. كرر الخطوات من 2-5 إلى تشغيل غير ذلك الوظيفة الإضافية.

راجع أيضًا:

المهام

الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع

الإرشادات التفصيلية: تمرير المجموعات بين المضيفين و إضافة-زر 'Ins'

المبادئ

متطلبات تطوير خط أنابيب

عقود وطرق العرض، و محولات

تطوير خطوط الأنابيب