2013-03-27 7 views
5

मैं अपने Windows सेवा के भीतर MEF संरचना में एक मुद्दा हो रहा हैMEF आयात Windows सेवा में विफल रहता है

नीचे वर्गों आंशिक वर्गों कि System.ServiceProcess.ServiceBase

Imports System.ServiceProcess 

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _ 
Partial Class svc_EpmsOPCService_6Cylinder_Zone1 
    Inherits System.ServiceProcess.ServiceBase 

    'UserService overrides dispose to clean up the component list. 
    <System.Diagnostics.DebuggerNonUserCode()> _ 
    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     Try 
      If disposing AndAlso components IsNot Nothing Then 
       If _catelog IsNot Nothing Then _catelog.Dispose() 
       If _mefContainer IsNot Nothing Then _mefContainer.Dispose() 
       components.Dispose() 
      End If 
     Finally 
      MyBase.Dispose(disposing) 
     End Try 
    End Sub 

    ' The main entry point for the process 
    <MTAThread()> _ 
    Shared Sub Main() 

#If Not Debug Then 
     Dim ServicesToRun() As System.ServiceProcess.ServiceBase 
     ServicesToRun = New System.ServiceProcess.ServiceBase() {New svc_EpmsOPCService_6Cylinder_Zone1} 
     System.ServiceProcess.ServiceBase.Run(ServicesToRun) 
#Else 
     Dim service = New Worker 
     service.InitWork() 
#End If 

    End Sub 

    'Required by the Component Designer 
    Private components As System.ComponentModel.IContainer 

    ' NOTE: The following procedure is required by the Component Designer 
    ' It can be modified using the Component Designer. 
    ' Do not modify it using the code editor. 
    <System.Diagnostics.DebuggerStepThrough()> _ 
    Private Sub InitializeComponent() 
     components = New System.ComponentModel.Container() 
     Me.ServiceName = "JCB.EpmsOPCService_6Cylinder_Zone1" 

    End Sub 

End Class 

Imports System.ComponentModel.Composition 
Imports System.ComponentModel.Composition.Hosting 
Imports Service.Common 

Public Class svc_EpmsOPCService_6Cylinder_Zone1 

    Private _catelog As AssemblyCatalog 
    Private _mefContainer As CompositionContainer 

    <Import(GetType(IServiceWorker))> 
    Private Property ServiceWorker As IServiceWorker 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     Dim catelog As AggregateCatalog = New AggregateCatalog(New DirectoryCatalog("."), New AssemblyCatalog(Reflection.Assembly.GetExecutingAssembly().CodeBase)) 
     _mefContainer = New CompositionContainer(_catelog) 
     _mefContainer.ComposeParts(Me) 

    End Sub 

    Protected Overrides Sub OnStart(ByVal args() As String) 
     ServiceWorker.InitWork() 
    End Sub 

    Protected Overrides Sub OnStop() 
     ServiceWorker.StopWork() 
     _mefContainer.Dispose() 
    End Sub 

End Class 

मुद्दा मैं कर रहा हूँ से विरासत हैं जब एमईएफ IServiceWorker संपत्ति पर संरचना को चलाने की कोशिश करता है तो यह विफल हो जाता है। शुरू में मैं हालांकि IServiceWorker के माध्यम से उपलब्ध भागों में से एक के रूप में AggregateCatalog

Dim catelog As AggregateCatalog = New AggregateCatalog(New DirectoryCatalog("."), New AssemblyCatalog(Reflection.Assembly.GetExecutingAssembly().CodeBase)) 

में आदेश में पुष्टि करने के लिए कि यह एक वैध हिस्सा मैं तो किसी पाठ फ़ाइल में भागों संग्रह outputted नीचे कोड का उपयोग कर रहा था नहीं आ रहा था कि।

For Each p As System.ComponentModel.Composition.Primitives.ComposablePartDefinition In catelog.Parts 
    System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, p.ToString, vbCrLf), Text.Encoding.Unicode) 

    For Each meta As KeyValuePair(Of String, Object) In p.Metadata 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat("Meta Data Key : ", meta.Key, vbCrLf), Text.Encoding.Unicode) 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat("Meta Data Val : ", meta.Value.ToString, vbCrLf), Text.Encoding.Unicode) 
    Next 

    For Each exp As Primitives.ExportDefinition In p.ExportDefinitions 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat("Export Definition Contract Name : ", exp.ContractName, vbCrLf), Text.Encoding.Unicode) 
    Next 

    For Each imp As Primitives.ImportDefinition In p.ImportDefinitions 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat("Import Definition Contract Name : ", imp.ContractName, vbCrLf), Text.Encoding.Unicode) 
    Next 

    System.IO.File.AppendAllText(compositionErrorLog, vbCrLf, Text.Encoding.Unicode) 

Next 

में आप उसे नीचे निकालने Service_EPMS_OPC_6Cylinder_Zone1.Worker भाग लागू IServiceWorker से देख सकते हैं अपने ExportDefinitions

Service.Common.DataAccess.AuditLogger 
Export Definition Contract Name : Service.Common.DataAccess.IAuditLogger 
Import Definition Contract Name : Service.Common.DataAccess.IDatabaseHelperFactory 

Service.Common.DataAccess.DataHelper 
Export Definition Contract Name : Service.Common.DataAccess.IDataHelper 
Import Definition Contract Name : Service.Common.DataAccess.IDatabaseHelperFactory 

Service.Common.DataAccess.SqlDatabaseHelperFactory 
Export Definition Contract Name : Service.Common.DataAccess.IDatabaseHelperFactory 

Service.Common.Logging.ErrorLogger 
Export Definition Contract Name : Service.Common.Logging.ILogger 
Import Definition Contract Name : Service.Common.DataAccess.IDataHelper 

Service.Common.Network.NetworkAvailability 
Export Definition Contract Name : Service.Common.Network.INetworkAvailability 
Import Definition Contract Name : Service.Common.DataAccess.IDataHelper 
Import Definition Contract Name : Service.Common.Network.IRemoteServiceHost 

Service.Common.Network.RemoteServiceHost 
Export Definition Contract Name : Service.Common.Network.IRemoteServiceHost 


Service.Common.ObjectCreation.EngineBuilder 
Export Definition Contract Name : Service.Common.ObjectCreation.IEngineBuilder 
Import Definition Contract Name : Service.Common.DataAccess.IDataHelper 

Service.Common.Opc.OpcHelper 
Export Definition Contract Name : Service.Common.Opc.IOpcHelper 

Service_EPMS_OPC_6Cylinder_Zone1.Worker 
Export Definition Contract Name : Service.Common.IServiceWorker 

Service_EPMS_OPC_6Cylinder_Zone1.ZoneProcess 
Export Definition Contract Name : Service.Common.IZoneProcess 
Import Definition Contract Name : Service.Common.Logging.ILogger 
Import Definition Contract Name : Service.Common.DataAccess.IDataHelper 
Import Definition Contract Name : Service.Common.Network.INetworkAvailability 
Import Definition Contract Name : Service.Common.ObjectCreation.IEngineBuilder 
Import Definition Contract Name : Service.Common.Opc.IOpcHelper 
Import Definition Contract Name : Service.Common.DataAccess.IAuditLogger 

इस रूप में Worker वर्ग प्रकार IServiceWorker पर निर्यात करता है कि मैं क्या अपेक्षा की होगी है। मैंने यह सुनिश्चित करने के लिए कि वे इस मुद्दे का कारण नहीं बना रहे हैं, इस वर्ग पर दो अतिरिक्त आयातों पर टिप्पणी की है।

Imports System.ComponentModel.Composition 
Imports System.ComponentModel.Composition.Hosting 
Imports System.Threading 
Imports Service.Common 
Imports Service.Common.Enums 
Imports Service.Common.Logging 

<Export(GetType(IServiceWorker))> 
Public Class Worker 
    Implements IServiceWorker 

    Private _thread As Thread 

    '<Import(GetType(IZoneProcess))> 
    'Private Property Processor() As IZoneProcess 

    '<Import(GetType(ILogger))> 
    'Private Property Logger() As ILogger 

#Region " Service Methods" 

    ''' <summary> 
    ''' Tear down the service 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub StopWork() Implements IServiceWorker.StopWork 
     'Tear down the worker thread 
     If Not _thread Is Nothing Then 
      If Not _thread.Join(100) Then 
       _thread.Abort() 
      End If 
     End If 

    End Sub 

    ''' <summary> 
    ''' Initialise the worker thread 
    ''' </summary> 
    ''' <remarks></remarks> 
    Public Sub InitWork() Implements IServiceWorker.InitWork 

     Dim objThreadStart As New ThreadStart(AddressOf Me.StartWork) 
     _thread = New Thread(objThreadStart) 
     _thread.Start() 

    End Sub 

    ''' <summary> 
    ''' Start the worker thread functionality 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private Sub StartWork() 

     Try 
      If Not Initialise() Then 
       Me.StopWork() 
      End If 

     Catch ex As Exception 
      ' If Logger IsNot Nothing Then Logger.LogError(My.Settings.ApplicationID, "StartWork", ex.Message, IssueSeverity.Critical) 
      Me.StopWork() 
     End Try 
    End Sub 

#End Region 

    Private Function Initialise() As Boolean 

#If DEBUG Then 
     RunDebugModeComposition() 
#End If 
     'Return Processor.InitialiseApplication() 

    End Function 

    Private Sub RunDebugModeComposition() 

     Try 
      Dim catelog As AggregateCatalog = New AggregateCatalog(New DirectoryCatalog("."), New AssemblyCatalog(Reflection.Assembly.GetExecutingAssembly().CodeBase)) 
      Dim container As CompositionContainer = New CompositionContainer(catelog) 
      container.ComposeParts(Me) 
     Catch ex As CompositionException 
      Throw New ApplicationException("The composition of the application failed. Pleae check the underlying exception", ex) 
     End Try 

    End Sub 

End Class 

मैं आगे नीचे कोड

Try 
    _mefContainer.ComposeParts(Me) 
Catch ex As CompositionException 
    For Each e As CompositionError In ex.Errors 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, "Description : ", e.Description, vbCrLf), Text.Encoding.Unicode) 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, "Message : ", e.Exception.Message, vbCrLf), Text.Encoding.Unicode) 
     System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, "Stack Trace : ", e.Exception.StackTrace, vbCrLf), Text.Encoding.Unicode) 

     If e.Exception.InnerException IsNot Nothing Then 
      System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, "Message : ", e.Exception.InnerException.Message, vbCrLf), Text.Encoding.Unicode) 
      System.IO.File.AppendAllText(compositionErrorLog, String.Concat(vbCrLf, "Stack Trace : ", e.Exception.InnerException.StackTrace, vbCrLf), Text.Encoding.Unicode) 
     End If 

    Next 
End Try 

यह खेल मुझे पाठ फ़ाइल में नीचे उत्पादन

Description : Cannot set import 'Service_EPMS_OPC_6Cylinder_Zone1.svc_EpmsOPCService_6Cylinder_Zone1.ServiceWorker (ContractName="Service.Common.IServiceWorker")' on part 'Service_EPMS_OPC_6Cylinder_Zone1.svc_EpmsOPCService_6Cylinder_Zone1'. 

Message : The composition produced a single composition error. The root cause is provided below. Review the CompositionException.Errors property for more detailed information. 

1) No exports were found that match the constraint: 
    ContractName Service.Common.IServiceWorker 
    RequiredTypeIdentity Service.Common.IServiceWorker 


Stack Trace : 

अब क्या मैं को लेकर अनिश्चित हूं क्यों है साथ संरचना मुद्दा queryed IServiceWorker एमईएफ कैटेलॉग पार्ट्स संग्रह में निर्यात ComposeParts द्वारा उठाया नहीं जा रहा है। जहां तक ​​मैं वर्कर क्लास पर निर्यात विशेषता देख सकता हूं पर svc_EpmsOPCService_6Cylinder_Zone1

कोई भी विचार क्यों यह आयात काम नहीं कर रहा है?

संपादित करें: मैंने कोड को दोबारा प्रतिक्रिया दी है ताकि 'वर्कर' वर्ग को ठोस कार्यान्वयन के रूप में बुलाया जा सके और संरचना 'वर्कर' कक्षा के भीतर होती है और सबकुछ काम करता है। क्या कोई सीमा है कि आप एमईएफ भागों को विंडोज सेवा घटक से लिख नहीं सकते हैं जो 'System.ServiceProcess.ServiceBase' से प्राप्त होता है?

+0

आप अभी भी सर्विसबेस का उपयोग क्यों कर रहे हैं? पीएम> इंस्टॉल-पैकेज टॉपशेल्फ बस टॉपशेल्फ़ पर जाकर शायद इस त्रुटि को खत्म कर देगा। –

+1

मैं सेवाबेस का उपयोग क्यों कर रहा हूं? विंडोज सेवा को लागू करने का यह मानक तरीका है। हम सभी ओपन सोर्स या गैर माइक्रोसॉफ्ट प्रौद्योगिकियों का उपयोग करने में सक्षम नहीं हैं। यह एक बड़े उद्यम व्यवसाय में काम करने के चमत्कार है। –

उत्तर

0

इस पर पार्टी के लिए देर हो चुकी है, लेकिन मुझे आश्चर्य है कि यह समस्या विंडोज रजिस्ट्रार और सेवाओं को कैसे बनाए रखती है उससे संबंधित है। मेरा मानना ​​है कि एससीएम या कुछ अन्य बैक एंड सर्विस घटक सेवा पंजीकृत होने पर संसाधनों को लॉक कर रहा है।

मुझे विश्वास नहीं है कि यह सर्विस बेस क्लास में और खुद के साथ एक मुद्दा है, यह बहुत अजीब प्रतीत नहीं होता है, यह स्थिर नहीं है, यह सिर्फ घटक को बढ़ाता है, बल्कि, मैं शर्त लगाता हूं कि यह संबंधित है खुद को और संसाधन प्रबंधन सेवाओं के लिए।

ग्रिन और गिगल्स के लिए, क्या आप अपने एमईएफ निर्देशिकासूची के लिए शैडोकॉपी का उपयोग कर रहे थे? अगर आपको आश्चर्य नहीं होता कि इससे मदद मिलेगी ... इनमें से कुछ अटकलें हैं क्योंकि मेरे पास अपना खुद का टेस्ट बेड स्थापित करने का समय नहीं है, लेकिन यह एमईएफ और सेवाओं दोनों के साथ अनुभव से शिक्षित अनुमान है।

संबंधित मुद्दे