الإرشادات التفصيلية: قم بإنشاء أحد تطبيقات القابلة للتوسيع
This معاينة describes how إلى إنشاء a pipeline for an إضافة-في that performs simple آلة حاسبة دالات. It does not demonstrate a real-world السيناريو; rather, it demonstrates the أساسى functionality of a pipeline و how an إضافة-في can provide الخدمات for a مضيف.
This معاينة describes the following tasks:
Creating a Visual Studio الحل.
Creating the pipeline الدليل بنية.
Creating the اتفاق و طرق العرض.
Creating the إضافة-في-side محول.
Creating the مضيف-side محول.
Creating the مضيف.
Creating the إضافة-في.
Deploying the pipeline.
تشغيل the تطبيق مضيف.
This pipeline passes فقط قابل للتسلسل أنواع (Double و String), between the مضيف و the إضافة-في. For an مثال that shows how إلى pass collections of complex بيانات أنواع, see الإرشادات التفصيلية: تمرير المجموعات بين المضيفين و إضافة-زر 'Ins'.
The اتفاق for this pipeline defines an كائن model of الرابع arithmetic العمليات: إضافة, subtract, multiply, و divide. The مضيف provides the إضافة-في مع an معادلة إلى calculate, such كـ 2 + 2, و the إضافة-في إرجاع the النتيجة إلى the مضيف.
Version 2 of the آلة حاسبة إضافة-في provides المزيد جارى الحساب possibilities و demonstrates تعيين الإصدار. It هو described في الإرشادات التفصيلية: تمكين توافق مع الإصدارات السابقة كتغييرات مضيف الخاص بك.
ملاحظة |
---|
You can بحث إضافى نموذج تعليمات برمجية, و العميل التقنية previews of أدوات for إنشاء? إضافة-في pipelines, at the مدارة التوافق مع البرامج الخارجية و إضافة-في Framework موقع تشغيل CodePlex. |
المتطلبات الأساسية
You need the following إلى إكمال this معاينة:
- Visual Studio.
Creating a Visual Studio الحل
استخدم a الحل في Visual Studio إلى contain the مشاريع of your pipeline segments.
إلى إنشاء the pipeline الحل
في Visual Studio, إنشاء a جديد مشروع named Calc1Contract. الأساس it تشغيل the فئة مكتبة قالب.
اسم the الحل CalculatorV1.
Creating the Pipeline الدليل بنية
The إضافة-في model يتطلب the pipeline segment تجميعات إلى be placed في a specified الدليل بنية. For المزيد معلومات حول the pipeline بنية, see متطلبات تطوير خط أنابيب.
إلى إنشاء the pipeline الدليل بنية
إنشاء تطبيق مجلد في أي مكان على جهاز الكمبيوتر الخاص بك.
في that مجلد, إنشاء the following بنية:
Pipeline AddIns CalcV1 CalcV2 AddInSideAdapters AddInViews Contracts HostSideAdapters
It ليس necessary إلى put the pipeline folder بنية في your مجلد التطبيقات; it هو done هنا فقط for convenience. في الخطوة المناسبة، معاينة توضح كيفية تغيير تعليمات برمجية إذا بنية المجلد أنابيب هو في الموقع آخر. راجع متطلبات الدليل خطوط الأنابيب في متطلبات تطوير خط أنابيب.
ملاحظة CalcV2المجلد هو غير مستخدمة في ترتيب هو معاينة؛ هو عنصرا نائبا ل الإرشادات التفصيلية: تمكين توافق مع الإصدارات السابقة كتغييرات مضيف الخاص بك.
إنشاء طرق عرض و اتفاق
يعرف المقطع اتفاق لخط الأنابيب هذا ICalc1Contractواجهة، الذي يعرف أربعة وظائف: add و subtract وmultiply و divide.
إلى إنشاء اتفاق
في Visual Studio الحل باسم من CalculatorV1، افتح مشروع Calc1Contract.
في مستكشف الحلول، إضافة مراجع تجميعات التالية إلى مشروع Calc1Contract:
النظام.AddIn.اتفاق.dll
النظام.AddIn.dll
فئة استثناء الافتراضي في من مستكشف الحلول، التي هو إضافة إلى مشاريع مكتبة فئة الجديدة.
في من مستكشف الحلول، قم بإضافة عنصر جديد? إلى المشروع، وذلك باستخدام واجهة قالب. في إضافة عنصر جديد? صندوق حوار، قم بتسمية واجهة من ICalc1Contract.
في الواجهة ملف، قم بإضافة مساحة الاسم مراجع System.AddIn.Contractو System.AddIn.Pipeline.
استخدم التالي تعليمات برمجية لإكمال مقطع هذا اتفاق. لاحظ أن هذا واجهة يجب أن يكون AddInContractAttributeالسمة.
Imports System.AddIn.Contract Imports System.AddIn.Pipeline Namespace CalculatorContracts ' The AddInContractAttribute identifes this pipeline segment as a ' contract. <AddInContract()> _ Public Interface ICalc1Contract Inherits IContract Function Add(ByVal a As Double, ByVal b As Double) As Double Function Subtract(ByVal a As Double, ByVal b As Double) As Double Function Multiply(ByVal a As Double, ByVal b As Double) As Double Function Divide(ByVal a As Double, ByVal b As Double) As Double End Interface End Namespace
using System.AddIn.Contract; using System.AddIn.Pipeline; namespace CalculatorContracts { // The AddInContractAttribute identifes this pipeline segment as a // contract. [AddInContract] public interface ICalc1Contract : IContract { double Add(double a, double b); double Subtract(double a, double b); double Multiply(double a, double b); double Divide(double a, double b); } }
بشكل اختياري، بناء على Visual Studio الحل. لا يمكن تشغيل الحل إلى أن الإجراء الأخير، ولكن بناء بعد كل إجراء كل مشروع يضمن هو الصحيح.
لأن إضافة-في طريقة العرض "و" عرض مضيف إضافة-في يكون عادة في نفس تعليمات برمجية، خاصة في النسخة الأولى من إضافة-في، يمكن بسهولة إنشاء طرق العرض في نفس الوقت. تختلف بواسطة عامل واحد فقط: إضافة-في طريقة العرض يتطلب AddInBaseAttributeسمة، أثناء عرض المضيف إضافة-في لا يتطلب أية السمات.
لإنشاء إضافة-في طريقة العرض
إضافة مشروع جديد باسم Calc1إضافةInView إلى CalculatorV1 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحلول، إضافة مرجع إلى النظام.إضافةIn.dll إلى مشروع Calc1إضافةInView.
في من مستكشف الحل، باستثناء فئة الافتراضية هي إضافة ed إلى مشاريع مكتبة فئة الجديدة، و إضافة عنصر جديد? إلى المشروع، وذلك باستخدام القالب واجهة. في صندوق الحوار إضافة عنصر جديد? ، قم بتسمية واجهة من ICalculator.
في الواجهة ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Pipeline.
استخدم التعليمات البرمجية التالية لإكمال هذا إضافة-في عرض. لاحظ أن هذا واجهة يجب أن يكون AddInBaseAttributeالسمة.
Imports System.AddIn.Pipeline Namespace CalcAddInViews ' The AddInBaseAttribute identifes this interface as the basis for the ' add-in view pipeline segment. <AddInBaseAttribute()> _ Public Interface ICalculator Function Add(ByVal a As Double, ByVal b As Double) As Double Function Subtract(ByVal a As Double, ByVal b As Double) As Double Function Multiply(ByVal a As Double, ByVal b As Double) As Double Function Divide(ByVal a As Double, ByVal b As Double) As Double End Interface End Namespace
using System.AddIn.Pipeline; namespace CalcAddInViews { // The AddInBaseAttribute identifes this interface as the basis for // the add-in view pipeline segment. [AddInBase()] public interface ICalculator { double Add(double a, double b); double Subtract(double a, double b); double Multiply(double a, double b); double Divide(double a, double b); } }
بشكل اختياري، بناء على Visual Studio الحل.
لإنشاء عرض المضيف إضافة-في
إضافة مشروع جديد باسم Calc1HVA إلى CalculatorV1 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في من مستكشف الحل، باستثناء فئة الافتراضية هي إضافة ed إلى مشاريع مكتبة فئة الجديدة، و إضافة عنصر جديد? إلى المشروع، وذلك باستخدام القالب واجهة. في صندوق الحوار إضافة عنصر جديد? ، قم بتسمية واجهة من ICalculator.
في الواجهة ملف، استخدم تعليمات برمجية التالية لإكمال مضيف عرض الوظيفة الإضافية.
Namespace CalcHVAs Public Interface ICalculator Function Add(ByVal a As Double, ByVal b As Double) As Double Function Subtract(ByVal a As Double, ByVal b As Double) As Double Function Multiply(ByVal a As Double, ByVal b As Double) As Double Function Divide(ByVal a As Double, ByVal b As Double) As Double End Interface End Namespace
namespace CalcHVAs { public interface ICalculator { double Add(double a, double b); double Subtract(double a, double b); double Multiply(double a, double b); double Divide(double a, double b); } }
بشكل اختياري، بناء على Visual Studio الحل.
إنشاء محول إضافة في-جانب
يتكون هذا المحول إضافة في-جانب من محول العرض للعقد. This pipeline segment converts the أنواع من the إضافة-في عرض إلى the اتفاق.
في this pipeline, the إضافة-في provides a الخدمة إلى the مضيف, و the أنواع تدفق من the إضافة-في إلى the مضيف. Because لا أنواع تدفق من the مضيف إلى the إضافة-في, you do not have إلى تضمين a اتفاق-إلى-عرض محول تشغيل the إضافة-في side of this pipeline.
إلى إنشاء the إضافة-في-side محول
إضافة a جديد مشروع named Calc1AddInSideAdapter إلى the CalculatorV1 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في الحل مستكشف, إضافة مراجع إلى the following تجميعات إلى the Calc1AddInSideAdapter مشروع:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
إضافة مراجع مشروع? إلى the مشاريع for the adjacent pipeline segments:
Calc1AddInView
Calc1Contract
تحديد each مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.
إعادة تسمية the مشروع's الافتراضي فئة CalculatorViewToContractAddInSideAdapter.
في الملف فئة، إضافة مساحة اسم المراجع إلى System.AddIn.Pipeline.
في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcAddInViews و CalculatorContracts. (في Visual أساسى, these مساحة الاسم مراجع are Calc1AddInView.CalcAddInViews و Calc1Contract.CalculatorContracts, unless you have turned إيقاف the الافتراضي مساحات الاسم في your Visual أساسى مشاريع.)
يطبق AddInAdapterAttributeالسمة إلى CalculatorViewToContractAddInSideAdapterفئة، وذلك لتعريفه إضافة-في-جانب محول.
جعل CalculatorViewToContractAddInSideAdapterيورث الفئة ContractBase، الذي يوفر الافتراضي تطبيق IContractالواجهة، ويقوم بتطبيق واجهة اتفاق لخط أنابيب، من ICalc1Contract.
إضافة على الدالة الإنشائية عام يقبل ICalculator، بالتخزين المؤقت في حقل خاص، وقم باستدعاء الدالة الإنشائية فئة Base.
لتطبيق الأعضاء من ICalc1Contract، بساطة استدعاء مثيل الأعضاء من ICalculator المطابقة التي يتم تمرير الدالة الإنشائية، وإرجاع نتائج. وهذا كلامك العرض ( من ICalculaإلىr) إلى اتفاق ( من ICalc1Contract).
يلي تعليمات برمجية يظهر محول إضافة في-جانب المكتملة.
Imports System.AddIn.Pipeline Imports Calc1AddInView.CalcAddInViews Imports Calc1Contract.CalculatorContracts Namespace CalcAddInSideAdapters ' The AddInAdapterAttribute identifes this class as the add-in-side ' adapter pipeline segment. <AddInAdapter()> _ Public Class CalculatorViewToContractAddInSideAdapter Inherits ContractBase Implements ICalc1Contract Private _view As ICalculator Public Sub New(ByVal view As ICalculator) MyBase.New() _view = view End Sub Public Function Add(ByVal a As Double, ByVal b As Double) As Double Implements ICalc1Contract.Add Return _view.Add(a, b) End Function Public Function Subtract(ByVal a As Double, ByVal b As Double) As Double Implements ICalc1Contract.Subtract Return _view.Subtract(a, b) End Function Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double Implements ICalc1Contract.Multiply Return _view.Multiply(a, b) End Function Public Function Divide(ByVal a As Double, ByVal b As Double) As Double Implements ICalc1Contract.Divide Return _view.Divide(a, b) End Function End Class End Namespace
using System.AddIn.Pipeline; using CalcAddInViews; using CalculatorContracts; namespace CalcAddInSideAdapters { // The AddInAdapterAttribute identifes this class as the add-in-side adapter // pipeline segment. [AddInAdapter()] public class CalculatorViewToContractAddInSideAdapter : ContractBase, ICalc1Contract { private ICalculator _view; public CalculatorViewToContractAddInSideAdapter(ICalculator view) { _view = view; } public virtual double Add(double a, double b) { return _view.Add(a, b); } public virtual double Subtract(double a, double b) { return _view.Subtract(a, b); } public virtual double Multiply(double a, double b) { return _view.Multiply(a, b); } public virtual double Divide(double a, double b) { return _view.Divide(a, b); } } }
بشكل اختياري، بناء على Visual Studio الحل.
قم بإنشاء مضيف من الجانب محول
يتكون هذا المحول مضيف من جانب واحد من اتفاق-إلى-عرض محول. كلامك القطعة من هذا اتفاق لعرض مضيف إضافة-في.
في خط أنابيب، إضافة-توفير الخدمة مضيف وتدفق أنواع من إضافة-في إلى مضيف. لأنه لا يوجد أنواع التدفق من مضيف إلى الوظيفة الإضافية، لم يكن لديك لتضمين طريقة عرض-إلى-اتفاق محول.
لتطبيق إدارة مدة بقاء، استخدم ContractHandleالكائن بإرفاق رمز مميز عمر إلى اتفاق. يجب أن تضع مرجع إلى هذا المؤشر من أجل إدارة عمر إلى العمل. بعد الرمز المميز هو تطبيق، لا يوجد برمجة إضافى هو المطلوبة لأن النظام الوظيفة الإضافى يمكنك dهوpose الكائنات عند أنها لم تعد مستخدمة وجعلها متوفرة لمجموعة البيانات المهملة. لمزيد من المعلومات، راجع إدارة مدة بقاء.
لإنشاء الجانب مضيف محول
إضافة مشروع جديد باسم Calc1HostSideAdapter إلى CalculatorV1 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحلول، إضافة مراجع تجميعات التالية إلى مشروع Calc1HostSideAdapter:
النظام.AddIn.dll
النظام.AddIn.اتفاق.dll
إضافة مراجع مشروع إلى مشاريع لقطاعات متجاورة:
Calc1Contract
Calc1HVA
تحديد each مشروع مرجع, و في خصائص التعيين نسخ محلي إلى خطأ. في Visual أساسى, استخدم the References علامة تبويب of مشروع خصائص إلى التعيين نسخ محلي إلى خطأ for the الثاني مراجع مشروع?.
قم بإعادة تسمية مشروع الافتراضي فئة من CalculatorContractToViewHostSideAdapter.
في الملف فئة، إضافة مساحة اسم المراجع إلى System.AddIn.Pipeline.
في the فئة ملف, إضافة مساحة الاسم مراجع for the adjacent segments: CalcHVAs و من CalculatorContracts. (في Visual أساسى، هذه المراجع مساحة الاسم هي Calc1HVA.CalcHVAs و Calc1Contract.CalculatorContracts ، إلا إذا توقف تشغيل مساحات الاسم الافتراضية في مشاريعك Visual أساسى.)
يطبق HostAdapterAttributeالسمة CalculatorContractToViewHostSide محول الفئة، لتعريف كجانب مضيف محول قطعة.
جعل الفئة CalculatorContractToViewHostSideAdapter بتطبيق واجهة يمثل عرض المضيف إضافة-في: Calc1HVAs.ICalculator ( Calc1HVA.CalcHVAs.ICalculator في Visual أساسى).
قم بإضافة على الدالة الإنشائية عام يقبل خط أنابيب اتفاق اكتب ICalc1 اتفاق . الدالة الإنشائية يجب أن ذاكرة التخزين المؤقتة للمرجع للعقد. يجب أيضا إنشاء وتخزين مؤقت جديد ContractHandleللعقد، لإدارة العمر إضافة-بوصة
هام ContractHandleهو هامة لإدارة عمر.إذا فشلت في احتفظ مرجع إلى ContractHandleالكائن، سيتم استرداد مجموعة البيانات المهملة، وسيتم إيقاف تشغيل خط أنابيب أسفل عند البرنامج إلا تتوقع it.يمكن أن يؤدي هذا إلى الأخطاء التي يصعب تشخيص، مثل كـ AppDomainUnloadedException.إيقاف تشغيل هو مرحلة عادية في فترة تواجد خط أنابيب، لذا هو لا توجد طريقة لإدارة عمر التعليمة البرمجية للكشف عن ذلك th هو شرط هو خطأ.
إلى تطبيق الأعضاء من ICalculaإلىr، ببساطة استدعاء أعضاء المقابل من ICalc1Contract المثيل الذي تم تمريره إلى construcإلىr، وإرجاع نتائج. وهذا كلامك اتفاق ( من ICalc1Contract) إلى عرض ( من ICalculator).
إظهار التعليمة البرمجية التالية المحول مضيف من جانب المكتملة.
Imports System.AddIn.Pipeline Imports Calc1Contract.CalculatorContracts Imports Calc1HVA.CalcHVAs Namespace CalcHostSideAdapters ' The HostAdapterAttribute identifes this class as the host-side adapter ' pipeline segment. <HostAdapterAttribute()> _ Public Class CalculatorContractToViewHostSideAdapter Implements ICalculator Private _contract As ICalc1Contract Private _handle As System.AddIn.Pipeline.ContractHandle Public Sub New(ByVal contract As ICalc1Contract) MyBase.New() _contract = contract _handle = New ContractHandle(contract) End Sub Public Function Add(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Add Return _contract.Add(a, b) End Function Public Function Subtract(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Subtract Return _contract.Subtract(a, b) End Function Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Multiply Return _contract.Multiply(a, b) End Function Public Function Divide(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Divide Return _contract.Divide(a, b) End Function End Class End Namespace
using System.AddIn.Pipeline; using CalcHVAs; using CalculatorContracts; namespace CalcHostSideAdapters { // The HostAdapterAttribute identifes this class as the host-side adapter // pipeline segment. [HostAdapterAttribute()] public class CalculatorContractToViewHostSideAdapter : ICalculator { private ICalc1Contract _contract; private System.AddIn.Pipeline.ContractHandle _handle; public CalculatorContractToViewHostSideAdapter(ICalc1Contract contract) { _contract = contract; _handle = new ContractHandle(contract); } public double Add(double a, double b) { return _contract.Add(a, b); } public double Subtract(double a, double b) { return _contract.Subtract(a, b); } public double Multiply(double a, double b) { return _contract.Multiply(a, b); } public double Divide(double a, double b) { return _contract.Divide(a, b); } } }
بشكل اختياري، بناء على Visual Studio الحل.
إنشاء مضيف
تفاعل تطبيق مضيف مع إضافة-من خلال عرض المضيف إضافة-في. فهو يستخدم إضافة-في أساليب الاكتشاف والتنشيط التي يوفرها في AddInStoreو AddInTokenالفئات للقيام بما يلي:
قم بتحديث ذاكرة تخزين مؤقت لخطوط الأنابيب و إضافة-في الحصول على المعلومات.
بحث إضافة-وظائف نوع عرض مضيف ICalculator، تحت الفرعي pipeline الدليل الجذر.
مطالبة مستخدم بتحديد الذي إضافة-باستخدام.
تنشيط المحدد إضافة-في مجال تطبيق جديد بمستوى الثقة الأمان معينة.
قم بتشغيل مخصصة RunCalculatorطريقة، قم باستدعاء وظائف إضافة-في's كما هو محدد بعرض مضيف الوظيفة الإضافية في.
إلى إنشاء مضيف
إضافة مشروع جديد باسم Calc1Host إلى CalculatorV1 الحل. تستند إلى القالب تطبيق وحدة تحكم به.
في مستكشف الحل، إضافة مرجع تجميع النظام.إضافةIn.dll إلى مشروع Calc1Host.
قم بإضافة مرجع مشروع إلى Calc1HVAالمشروع. تحديد مرجع مشروع، وفي خصائص تعيين نسخ محلية خطأ. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ .
إعادة تسمية الفئة ملف (وحدة نمطية في Visual أساسى) من MathHost1.
في Visual أساسى، استخدم علامة تبويب التطبيقات من خصائص مشروع صندوق حوار لتعيين كائن بدء التشغيل الرئيسي منخفض .
في الفئة أو وحدة نمطية ملف، قم بإضافة مرجع مساحة الاسم System.AddIn.Hosting.
في الفئة أو وحدة نمطية ملف، قم بإضافة مرجع مساحة الاسم لعرض مضيف من الوظيفة الإضافية: CalcHVAs. (في Visual أساسى، مرجع مساحة الاسم هذا هو Calc1HVA.CalcHVAs، إلا إذا توقف تشغيل مساحات الاسم الافتراضية في مشاريعك Visual أساسى.)
في من مستكشف الحل، تحديد الحل و اختر خصائص من قائمة مشروع. في صندوق الحوار الحل الصفحات الخاصية ، قم بتعيين مشروع واحد لبدء التشغيل إلى أن هذا مشروع تطبيق مضيف.
في الفئة أو وحدة نمطية ملف، استخدم AddInStore.Updateأسلوب تحديث ذاكرة تخزين مؤقت. استخدام AddInStore.FindAddInطريقة للحصول على مجموعة من الرموز المميزة، واستخدام AddInToken.Activateأسلوب تنشيط إضافة-بوصة
يلي تعليمات برمجية يظهر تطبيق مضيف المكتملة.
Imports System.Collections.Generic Imports System.Collections.ObjectModel Imports System.AddIn.Hosting Imports Calc1HVA.CalcHVAs Namespace MathHost Module MathHost1 Sub Main() ' Assume that the current directory is the application folder, ' and that it contains the pipeline folder structure. Dim addInRoot As String = Environment.CurrentDirectory & "\Pipeline" ' Update the cache files of the pipeline segments and add-ins. Dim warnings() As String = AddInStore.Update(addInRoot) For Each warning As String In warnings Console.WriteLine(warning) Next ' Search for add-ins of type ICalculator (the host view of the add-in). Dim tokens As System.Collections.ObjectModel.Collection(Of AddInToken) = _ AddInStore.FindAddIns(GetType(ICalculator), addinRoot) ' Ask the user which add-in they would like to use. Dim calcToken As AddInToken = ChooseCalculator(tokens) ' Activate the selected AddInToken in a new application domain ' with the Internet trust level. Dim calc As ICalculator = _ calcToken.Activate(Of ICalculator)(AddInSecurityLevel.Internet) ' Run the add-in. RunCalculator(calc) 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 ICalculator) If IsNothing(calc) Then 'No calculators were found, read a line and exit. Console.ReadLine() End If Console.WriteLine("Available operations: +, -, *, /") Console.WriteLine("Request a calculation , such as: 2 + 2") Console.WriteLine("Type 'exit' to exit") Dim line As String = Console.ReadLine While Not line.Equals("exit") ' The Parser class parses the user's input. Try Dim c As Parser = New Parser(line) Select Case (c.action) Case "+" Console.WriteLine(calc.Add(c.a, c.b)) Case "-" Console.WriteLine(calc.Subtract(c.a, c.b)) Case "*" Console.WriteLine(calc.Multiply(c.a, c.b)) Case "/" Console.WriteLine(calc.Divide(c.a, c.b)) Case Else Console.WriteLine("{0} is an invalid command. Valid commands are +,-,*,/", c.action) End Select Catch Ex As System.Exception Console.WriteLine("Invalid command: {0}. Commands must be formated: [number] [operation] [number]", line) End Try line = Console.ReadLine End While End Sub End Module 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.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"; // Update the cache files of the pipeline segments and add-ins. string[] warnings = AddInStore.Update(addInRoot); foreach (string warning in warnings) { Console.WriteLine(warning); } // Search for add-ins of type ICalculator (the host view of the add-in). Collection<AddInToken> tokens = AddInStore.FindAddIns(typeof(ICalculator), 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. ICalculator calc = calcToken.Activate<ICalculator>(AddInSecurityLevel.Internet); // Run the add-in. RunCalculator(calc); } 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(ICalculator calc) { if (calc == null) { //No calculators were found; read a line and exit. Console.ReadLine(); } Console.WriteLine("Available operations: +, -, *, /"); Console.WriteLine("Request a calculation , such as: 2 + 2"); 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); switch (c.Action) { case "+": Console.WriteLine(calc.Add(c.A, c.B)); break; case "-": Console.WriteLine(calc.Subtract(c.A, c.B)); break; case "*": Console.WriteLine(calc.Multiply(c.A, c.B)); break; case "/": Console.WriteLine(calc.Divide(c.A, c.B)); break; default: Console.WriteLine("{0} is an invalid command. Valid commands are +,-,*,/", c.Action); break; } } catch { Console.WriteLine("Invalid command: {0}. Commands must be formated: [number] [operation] [number]", line); } line = Console.ReadLine(); } } } internal class Parser { double a; double b; string action; internal Parser(string line) { string[] parts = line.Split(' '); a = double.Parse(parts[0]); action = parts[1]; b = double.Parse(parts[2]); } public double A { get { return a; } } public double B { get { return b; } } public string Action { get { return action; } } } }
ملاحظة وهذا تعليمات برمجية تفترض أن بنية المجلد خطوط الأنابيب الموجود في مجلد التطبيقات.إذا قمت بتحديد موقعة من مكان آخر، تغيير الخط تعليمات برمجية الذي يعين addInRootالمتغير، حيث يحتوي المتغير على مسار الخاص بك بنية الدليل خطوط الأنابيب.
تستخدم التعليمة البرمجية ChooseCalculatorأسلوب سرد الرموز المميزة ومطالبة مستخدم باختيار إضافة-بوصة RunCalculatorأسلوب يطالب مستخدم التعبيرات الرياضية البسيطة، يوزع تعبيرات تستخدم Parserللفئات، ويعرض نتائج التي تم إرجاعها بواسطة إضافة-بوصة
بشكل اختياري، بناء على Visual Studio الحل.
Creatفيg إضافة-في
إضافة-في implements الأساليب المحددة إضافة-في عرض. وهذا إضافة-تطبيق Add، Subtract، Multiply، و Divideالعمليات وإرجاع نتائج إلى مضيف.
لإنشاء إضافة-في
إضافة مشروع جديد يسمى إضافة InCalcV1 إلى CalculatorV1 الحل. الأساس it تشغيل the فئة مكتبة قالب.
في مستكشف الحل، إضافة مرجع تجميع النظام.إضافةIn.dll إلى مشروع.
إضافة مرجع مشروع إلى المشروع Calc1إضافةInView. تحديد مرجع مشروع، و في خصائص، قم بتعيين نسخة محلية إلى خطأ. في Visual أساسى، استخدم علامة تبويب مراجع من خصائص مشروع إلى تعيين النسخ المحلية إلى خطأ مرجع في مشروع.
إعادة تسمية فئة AddInCalcV1.
في الملف فئة إضافة مرجع مساحة الاسم System.AddInو إضافة-في جزء طريقة العرض: CalcAddInViews ( Calc1AddInView.CalcAddInViews في Visual أساسى).
يطبق AddInAttributeالسمة إلى AddInCalcV1الفئة، لتعريف فئة إضافة-بوصة
جعل AddInCalcV1الفئة بتطبيق واجهة التي تمثل إضافة-في عرض: CalcAddInViews.ICalculator ( Calc1AddInView.CalcAddInViews.ICalculator في Visual أساسى).
قم بتطبيق الأعضاء من ICalculator بإرجاع نتائج الحسابات المناسبة.
إظهار التعليمة البرمجية التالية في إكمال إضافة-في.
Imports System.AddIn Imports Calc1AddInView.CalcAddInViews Namespace CalcAddIns ' The AddInAttribute identifies this pipeline segment as an add-in. <AddIn("Calculator AddIn", Version:="1.0.0.0")> _ Public Class AddInCalcV1 Implements ICalculator Public Function Add(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Add Return (a + b) End Function Public Function Subtract(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Subtract Return (a - b) End Function Public Function Multiply(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Multiply Return (a * b) End Function Public Function Divide(ByVal a As Double, ByVal b As Double) As Double _ Implements ICalculator.Divide Return (a / b) End Function End Class End Namespace
using System.Collections.Generic; using System.AddIn; using CalcAddInViews; namespace CalcAddIns { // The AddInAttribute identifies this pipeline segment as an add-in. [AddIn("Calculator AddIn",Version="1.0.0.0")] public class AddInCalcV1 : ICalculator { public double Add(double a, double b) { return a + b; } public double Subtract(double a, double b) { return a - b; } public double Multiply(double a, double b) { return a * b; } public double Divide(double a, double b) { return a / b; } } }
بشكل اختياري، بناء على Visual Studio الحل.
نشر في خط أنابيب
أنت الآن جاهز إلى إنشاء ونشر مقاطع الوظيفة الإضافية إلى بنية direcإلىry أنابيب المطلوبة.
لنشر القطع على خط أنابيب
For each مشروع في the الحل, استخدم the بنية علامة تبويب of مشروع خصائص (the يحول برمجياً علامة تبويب في Visual أساسى) إلى التعيين the القيمة of the إخراج مسار (the بنية إخراج مسار في Visual أساسى). إذا قمت بتسميته تطبيق المجلد MyApp، على سبيل المثال، سيتم بنية المشاريع في المجلدات التالية:
Project
Path
AddInCalcV1
MyApp\Pipeline\الوظائف الإضافية\CalcV1
Calc1AddInSideAdapter
MyApp\Pipeline\AddInSideAdapters
Calc1AddInView
MyApp\Pipeline\AddInViews
Calc1Contract
MyApp\Pipeline\Contracts
Calc1Host
اسم التطبيق
Calc1HostSideAdapter
MyApp\Pipeline\HostSideAdapters
Calc1HVA
اسم التطبيق
ملاحظة If you decided إلى put your pipeline folder بنية في a الموقع غير ذلك than your مجلد التطبيقات, you must تعديل the paths shown في the جدول accordingly.راجع متطلبات الدليل خطوط الأنابيب في متطلبات تطوير خط أنابيب.
بنية the Visual Studio الحل.
فحص من تطبيق و pipeline الدلائل للتأكد من أن تجميعات التي تم النسخها إلى الدلائل الصحيح و التي لا توجد النسخ إضافية من تجميعات التي تم تثبيتها في المجلدات غير صحيح.
ملاحظة في حالة عدم تغيير نسخ محلية ل خطأ ل Calc1AddInViewمشروع مرجع في AddInCalcV1مشروع، إلى منع مشاكل في سياق برنامج تحميل الوظيفة الإضافية من الآن موجود.
للحصول على المعلومات حول توزيع إلى أنابيب، راجع متطلبات تطوير خط أنابيب.
تشغيل تطبيق مضيف
أنت الآن جاهز لتشغيل مضيف والتفاعل معها إضافة-في.
إلى تشغيل التطبيق المضيف
في تعجيل الأوامر، انتقل إلى الدليل تطبيق و تشغيل تطبيق مضيف، Calc1Host.exe .
العثور على مضيف متوفراً على كافة إضافة-وظائف نوعها ويطالبك بتحديد إضافة-في. قم بإدخال 1 لإضافة متوفر فقط-في.
Enter الزر الزر معادلة للحاسبة، مثل كـ 2 + 2. يجب أن يكون هناك مسافات بين الأرقام و عامل التشغيل.
نوع إنهاء وضغط المفتاح Enter الزر بإغلاق تطبيق.
راجع أيضًا:
المهام
الإرشادات التفصيلية: تمكين توافق مع الإصدارات السابقة كتغييرات مضيف الخاص بك
الإرشادات التفصيلية: تمرير المجموعات بين المضيفين و إضافة-زر 'Ins'