Развертывание частей MEF - PullRequest
       35

Развертывание частей MEF

0 голосов
/ 21 января 2011

Я создал исполняемую оболочку, которая с помощью MEF загружает сборки (детали MEF) и отображает / действует в соответствии с загруженной функциональностью.

Теперь я хочу развернуть это приложение как установку ClickOnce. У кого-нибудь есть стратегия для этого, на данный момент я видел 2 стратегии.

  1. Сборка и установка компонентов и добавление их в качестве компонента перераспределения в приложение оболочки - это означает, что две установки в основном сварены вместе, и это означает, что MEF в основном бессмысленно

  2. Встроить функцию загрузки в оболочку, это опять-таки означает, что каждая часть MEF должна быть известна, прежде чем мы начнем, и делает MEF бессмысленным.

Кто-нибудь еще знает о каких-либо других подходах? Могу ли я построить зависимость наоборот, чтобы установщик clickonce для частей MEF знал, какую оболочку он должен использовать?

Спасибо

1 Ответ

1 голос
/ 24 января 2011

Я использовал Packaging API и создал собственное расширение файла, которое сопоставлено с интерфейсом оболочки. Все, что он делает, это разархивирует пакет в папку ProgramData \ MyApp \ Extensions. Затем, когда приложение перезапускается, появляется часть.

См. Этот блог для получения дополнительной информации

           ' Open the Package.
        ' ('using' statement insures that 'package' is
        '  closed and disposed when it goes out of scope.)
        Using package As Package = package.Open(fileName, FileMode.Open, FileAccess.Read)
            tFolder = IO.Path.Combine(tFolder,
                MediaToolz.SharedServices.FileSystem.GetSafeFileName(package.PackageProperties.Title))

            Dim directoryInfo As New DirectoryInfo(tFolder)
            If directoryInfo.Exists Then
                directoryInfo.Delete(True)
            End If
            directoryInfo.Create()

            For Each part In package.GetParts()
                If part.ContentType = Packages.MediaToolzAddinMimeType Then
                    ExtractPart(part, tFolder)
                End If
            Next

            package.Close()
        End Using


'  --------------------------- ExtractPart ---------------------------
''' <summary>
'''   Extracts a specified package part to a target folder.</summary>
''' <param name="packagePart">
'''   The package part to extract.</param>
''' <param name="targetDirectory">
'''   The relative path from the 'current' directory
'''   to the targer folder.</param>
Private Shared Sub ExtractPart(ByVal packagePart As PackagePart, ByVal targetDirectory As String)
    ' Create a string with the full path to the target directory.
    Dim pathToTarget As String = targetDirectory
    If pathToTarget.EndsWith(IO.Path.DirectorySeparatorChar) = False Then pathToTarget += IO.Path.DirectorySeparatorChar
    ' Remove leading slash from the Part Uri,
    '   and make a new Uri from the result
    Dim stringPart As String = packagePart.Uri.ToString().TrimStart("/"c)
    ' I added this line to take off the content pat
    stringPart = IO.Path.GetFileName(stringPart)

    Dim partUri As New Uri(stringPart, UriKind.Relative)

    ' Create a full Uri to the Part based on the Package Uri
    Dim uriFullPartPath As New Uri(New Uri(pathToTarget, UriKind.Absolute), partUri)

    ' Create the necessary Directories based on the Full Part Path
    'Directory.CreateDirectory(Path.GetDirectoryName(uriFullPartPath.LocalPath))

    ' Create the file with the Part content
    Using fileStream As New FileStream(uriFullPartPath.LocalPath, FileMode.Create)
        CopyStream(packagePart.GetStream(), fileStream)
    End Using 'Close & dispose fileStream.
End Sub

'  --------------------------- CopyStream ---------------------------
''' <summary>
'''   Copies data from a source stream to a target stream.</summary>
''' <param name="source">
'''   The source stream to copy from.</param>
''' <param name="target">
'''   The destination stream to copy to.</param>
Private Shared Sub CopyStream(ByVal source As Stream, ByVal target As Stream)
    Const bufSize As Integer = &H1000
    Dim buf(bufSize - 1) As Byte
    Dim bytesRead As Integer = 0
    bytesRead = source.Read(buf, 0, bufSize)
    Do While bytesRead > 0
        target.Write(buf, 0, bytesRead)
        bytesRead = source.Read(buf, 0, bufSize)
    Loop
End Sub
...