الإرشادات التفصيلية: تمكين توافق مع الإصدارات السابقة كتغييرات مضيف الخاص بك
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.
المتطلبات الأساسية
تحتاج إلى المكونات التالية لاستكمال هذه الإرشادات التفصيلية:
Visual Studio.
الإصدار أنابيب 1 في الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع. لأنه يستخدم الإصدار 2 مقاطع خطوط الأنابيب التي تم تطويرها في الإصدار 1، يجب وضع وتوزيع خطوط الأنابيب للإصدار 1 قبل تنفيذ الخطوات المذكورة في هذا الموضوع.
Creating a Visual Studio الحل
استخدم a الحل في Visual Studio إلى contain the مشاريع of your pipeline segments.
إلى إنشاء the pipeline الحل
في Visual Studio، قم بإنشاء مشروع جديد باسم من Calc2Contract. الأساس it تشغيل the فئة مكتبة قالب.
قم بتسمية الحل من 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الأسلوب.
مضيف باستدعاء هذا الأسلوب بإرسال معادلة إضافة-في حساب وإرجاع النتيجة.
إلى إنشاء اتفاق
في Visual Studio الحل باسم من CalculatorV2، افتح مشروع Calc2Contract.
في مستكشف الحلول، إضافة مراجع للتجميعات التالية إلى مشروع Calc2Contract:
النظام.AddIn.اتفاق.dll
النظام.AddIn.dll
فئة استثناء الافتراضي في من مستكشف الحلول، التي هو إضافة إلى مشاريع مكتبة فئة الجديدة.
إضافة عنصر جديد? إلى المشروع، وذلك باستخدام القالب واجهة. في صندوق الحوار إضافة عنصر جديد? ، قم بتسمية واجهة من ICalc2Contract.
في الواجهة ملف، قم بإضافة مساحة الاسم مراجع System.AddIn.Contractو System.AddIn.Pipeline.
تستخدم التعليمة البرمجية التالية إلى إتمام المقطع اتفاق. لاحظ أن هذا واجهة يجب أن يكون 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
إضافة مشروع جديد باسم Calc2إضافةInView إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحلول، إضافة مرجع إلى النظام.إضافةIn.dll إلى مشروع Calc2إضافةInView.
إعادة تسمية فئة من Calculator2.
في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.
جعل Calculator2 abstractفئة ( MustInheritفئة في Visual أساسى).
استخدم تعليمات برمجية التالية لهذا إضافة-في طريقة العرض. لاحظ أن هذا فئة يجب أن يكون 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); } }
لإنشاء عرض المضيف إضافة-في
إضافة مشروع جديد باسم Calc2HVA إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
قم بإعادة تسمية الفئة آلة حاسبة.
جعل من آلة حاسبة abstractفئة ( MustInheritفئة في Visual أساسى).
في الملف فئة، استخدم تعليمات برمجية التالية لإنشاء طريقة عرض للمضيف إضافة-في.
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
في من مستكشف الحل، انقر نقراً مزدوجاً فوق CalculatorV2 الحل.
إضافة، انقر و ثم انقر فوق مشروع الموجود.
انتقل إلى المجلدات التي تحتوي على " CalculatorV1 الحل و حدد ملف مشروع للمشروع Calc1AddInView.
إنشاء محول إضافة في-جانب
يتكون هذا المحول إضافة في-جانب من محولين view-إلى-اتفاق: للتكيف مع الإصدار 2 الوظيفة الإضافية العرض إلى الإصدار 2 اتفاق، والآخر التكيف مع الإصدار 1 وظيفة إضافية العرض إلى الإصدار 2 اتفاق.
في this pipeline, the إضافة-في provides a الخدمة إلى the مضيف, و the أنواع تدفق من the إضافة-في إلى the مضيف. لأنه لا يوجد أنواع التدفق من مضيف إضافة-في، لم يكن لديك لتضمين محول العرض للعقد.
إلى إنشاء the إضافة-في-side محول
إضافة مشروع جديد باسم Calc2إضافةInSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحل، إضافة مراجع تجميعات التالية إلى مشروع Calc2إضافةInSideAdapter:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
قم بإضافة مراجع مشروع? على مشاريع التالية:
Calc2AddInView
Calc2Contract
تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. The تجميعات will be located في the pipeline الدليل, كـ described في the "Deploying the Pipeline" إجراء later في this معاينة. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.
إعادة تسمية the مشروع's الافتراضي فئة CalculatorViewToContractAddInSideAdapter.
في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.
في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcAddInViews و CalculatorContracts. (في Visual أساسى, these مساحة الاسم مراجع are Calc2AddInView.CalcAddInViews و Calc2Contract.CalculatorContracts, unless you have turned إيقاف the الافتراضي مساحات الاسم في your Visual أساسى مشاريع.)
استخدم 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 محول
إضافة مشروع جديد باسم Calc2V1toV2إضافةInSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحلول، إضافة مراجع للتجميعات التالية إلى مشروع Calc2V1toV2AddInSideAdapter:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
قم بإضافة مراجع مشروع? على مشاريع التالية:
Calc1AddInView
Calc2Contract
تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.
قم بإعادة تسمية مشروع الافتراضي فئة من Calc2V1ViewToV2ContractAddInSideAdapter.
في الفئة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.
في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcAddInViews و CalculatorContracts. (في Visual أساسى هذه المراجع مساحة الاسم هي Calc1AddInView.CalcAddInViews و Calc2Contract.CalculatorContracts ، إلا إذا كنت قمت بتشغيل إيقاف مساحات الاسم الافتراضية في مشاريعك Visual أساسى.) لاحظ أنه يتم عرض مساحة الاسم من الإصدار 1 و اتفاق من الإصدار 2.
يطبق AddInAdapterAttributeالسمة Calc2V1ViewToV2ContractإضافةInSideAdapter فئة لتعريفه إضافة-في-جانب محول.
جعل الفئة Calc2V1ViewToV2ContractAddInSideAdapter يورث ContractBase، الذي يوفر الافتراضي تطبيق IContractالواجهة، ويقوم بتطبيق واجهة اتفاق 2 الإصدار لخط أنابيب، من ICalc2Contract.
إضافة على الدالة الإنشائية عام يقبل ICalculator، بالتخزين المؤقت في حقل خاص، وقم باستدعاء الدالة الإنشائية فئة Base.
لتطبيق الأعضاء من 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 الكائنات عند أنها لم تعد مستخدمة وجعلها متوفرة لمجموعة البيانات المهملة. لمزيد من المعلومات، راجع إدارة مدة بقاء.
لإنشاء الجانب مضيف محول
إضافة مشروع جديد باسم Calc2HostSideAdapter إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحل، إضافة مراجع تجميعات التالية إلى مشروع Calc2HostSideAdapter:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
قم بإضافة مراجع مشروع? على مشاريع التالية:
Calc2Contract
Calc2HVA
تحديد كل مرجع مشروع، كما في خصائص التعيين نسخ محلية ل خطأ، لمنع تجميعات المشار إليها من تم نسخها إلى المحلي بنية المجلد. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.
قم بإعادة تسمية مشروع الافتراضي فئة من CalculatorContractToViewHostSideAdapter.
في الملف فئة، إضافة مساحة اسم المراجع إلى System.AddIn.Pipeline.
في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcHVAs و من CalculatorContracts. (في Visual أساسى، هذه المراجع مساحة الاسم هي Calc2HVA.CalcHVAs و Calc2Contract.CalculatorContracts ، إلا إذا توقف تشغيل مساحات الاسم الافتراضية في مشاريعك Visual أساسى.)
يطبق HostAdapterAttributeسمة فئة CalculatorContractToViewHostSide محول لتعريفه كجانب مضيف محول.
جعل الفئة CalculatorContractToViewHostSideAdapter ترث الفئة الأساسية مجردة يمثل عرض المضيف إضافة-في: CalcHVAs.آلة حاسبة ( Calc2HVA.CalcHVAs.آلة حاسبة في Visual أساسى). لاحظ الفرق من الموقع عرض مضيف الوظيفة-في الإصدار 1، هو واجهة.
إضافة الكتابة على الدالة الإنشائية عام يقبل عقد خط أنابيب، من ICalc2Contract. الدالة الإنشائية يجب أن ذاكرة التخزين المؤقتة للمرجع للعقد. يجب أيضا إنشاء وتخزين مؤقت جديد ContractHandleللعقد، لإدارة العمر إضافة-بوصة
هام ContractHandleهو هامة لإدارة عمر.إذا فشلت في احتفظ مرجع إلى ContractHandleالكائن، سيتم استرداد مجموعة البيانات المهملة، وسيتم إيقاف تشغيل خط أنابيب أسفل عند البرنامج إلا تتوقع it.يمكن أن يؤدي هذا إلى الأخطاء التي يصعب تشخيص، مثل كـ AppDomainUnloadedException.إيقاف تشغيل هو مرحلة عادية في فترة تواجد خط أنابيب، لذا هو لا توجد طريقة لإدارة عمر التعليمة البرمجية للكشف عن ذلك th هو شرط هو خطأ.
عند يمنع الأعضاء من آلة حاسبة، بساطة استدعاء أعضاء المقابل من 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 إضافة-في.
إلى إنشاء مضيف
إضافة a جديد مشروع named MathHost2 إلى the CalculatorV2 الحل. تستند إلى القالب تطبيق وحدة تحكم به.
في الحل مستكشف, إضافة a مرجع إلى the النظام.AddIn.dll تجميع إلى the MathHost2 مشروع.
قم بإضافة مرجع مشروع إلى Calc2HVAالمشروع. تحديد the مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ, إلى prevent the مشار إليها تجميع من being copied إلى the محلي بنية مجلد. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ .
إعادة تسمية the فئة ملف (وحدة نمطية? في Visual أساسى) MathHost2.
في Visual أساسى، استخدم علامة تبويب التطبيقات من خصائص مشروع صندوق حوار لتعيين كائن بدء التشغيل الرئيسي منخفض .
في الفئة أو وحدة نمطية ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Hosting.
في the فئة أو وحدة نمطية? ملف, إضافة a مساحة الاسم مرجع for the مضيف-عرض of the إضافة-في: CalcHVAs. (في Visual أساسى, this مساحة الاسم مرجع هو Calc2HVA.CalcHVAs, unless you have turned إيقاف the الافتراضي مساحات الاسم في your Visual أساسى مشاريع.)
في من مستكشف الحل، تحديد الحل و اختر خصائص من قائمة مشروع. في صندوق الحوار الحل الصفحات الخاصية ، قم بتعيين مشروع واحد لبدء التشغيل إلى أن هذا مشروع تطبيق مضيف.
استخدم 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يوفر الأسلوب تعليمات برمجية لحساب النتيجة استناداً إلى تحديد للمضيف عملية والأرقام الثاني.
لإنشاء إضافة-في
إضافة مشروع جديد يسمى إضافة InCalcV2 إلى CalculatorV2 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحل، إضافة مراجع تجميعات التالية إلى إضافة InCalcV2 مشروع:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
قم بإضافة مرجع مشروع إلى Calc2AddInViewالمشروع. تحديد the مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ, إلى prevent the مشار إليها تجميع من being copied إلى the محلي بنية مجلد. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ .
إعادة تسمية ملف فئة SampleV2AddIn.
في الفئة ملف، قم بإضافة مساحة اسم مراجع System.AddInو System.AddIn.Pipeline. System.AddIn.Pipelineهو مطلوب فقط لأن تعليمات برمجية تتضمن مثالاًQualificationDataAttributeالسمة.
في الملف فئة إضافة مرجع مساحة الاسم للإصدار 2 إضافة-في جزء طريقة العرض: CalcAddInViews ( Calc2AddInView.CalcAddInViews في Visual أساسى).
يطبق AddInAttributeالسمة إلى SampleV2AddInالفئة، لتعريف فئة إضافة-بوصة
يطبق QualificationDataAttributeسمة إلى SampleV2AddInالفئة، ثم قم بتحديد المعلومات التي يمكن استرداد مضيف من AddInToken. في هذه الحالة، يقترح المعلومات التي إضافة-في يجب تحميله في مجال تطبيق الخاص به. انظر كيفية القيام بما يلي: استخدم تأهيل بيانات
جعل SampleV2AddInترث الفئة فئة مجردة الأساسية التي تمثل إضافة-في عرض: Calculator2.
يمنع الأعضاء من 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 أنابيب المطلوبة.
لنشر القطع على خط أنابيب
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
اسم التطبيق
ملاحظة إذا قمت بوضع بنية المجلد خطوط الأنابيب الخاصة بك في الموقع غير ذلك من مجلد التطبيقات الخاص بك، يجب عليك تعديل المسارات التي تظهر في الجدول وفقا لذلك.
بنية the Visual Studio الحل.
فحص من تطبيق و pipeline الدلائل، للتأكد من أنه تم النسخ تجميعات إلى الأدلة الصحيحة، و التي لا توجد النسخ إضافية من تجميعات التي تم تثبيتها في المجلدات غير صحيح.
ملاحظة في حالة عدم تغيير نسخ محلية ل خطأ ل Calc2AddInViewمشروع مرجع في AddInCalcV2مشروع، إلى منع مشاكل في سياق برنامج تحميل الوظيفة الإضافية من الآن موجود.
للحصول على المعلومات حول توزيع إلى أنابيب، راجع متطلبات تطوير خط أنابيب.
تشغيل تطبيق مضيف
أنت الآن جاهز لتشغيل مضيف والتفاعل معها إضافة-زر 'Ins'.
إلى تشغيل التطبيق المضيف
تأكد من أن كلا الإصدارين من إضافة-النشر.
في comm و مطالبة، انتقل إلى الدليل تطبيق و تشغيل تطبيق مضيف. في ترتيب هو سبيل المثال، تطبيق مضيف هو من MathHost2.exe.
العثور على مضيف متوفراً على كافة إضافة-وظائف نوعها ويطالبك بتحديد إضافة-في. Enter الزر 1 أو 2.
Enter الزر الزر معادلة للحاسبة، مثل كـ 2 + 2.
نوع إنهاء وضغط المفتاح Enter الزر بإغلاق تطبيق.
كرر الخطوات من 2-5 إلى تشغيل غير ذلك الوظيفة الإضافية.
راجع أيضًا:
المهام
الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع
الإرشادات التفصيلية: تمرير المجموعات بين المضيفين و إضافة-زر 'Ins'