2011-01-21 9 views
0

MEFロードアセンブリ(MEFパーツ)を使用し、ロードされた機能に応じて表示/動作する実行可能シェルを構築しました。MEFパーツのデプロイ

ここで、このアプリケーションをClickOnceインストールとして展開したいと考えています。誰かがこれのための戦略を持っている、私は2つの戦略を見ている瞬間です。

  1. ビルドインストーラ部品およびシェルアプリケーションにRedistributalコンポーネントとして追加 - これは2つのインストールは基本的に一緒に溶接されていることを意味し、それは、MEFは

  2. ビルドA基本的に無意味であることを意味しますこれは、MEFを始める前に各MEFの部分を知り、MEFを無意味にする必要があることを意味します。

その他の方法は他にもありますか?依存関係を他の方法で構築することはできますか?そのため、MEFの部品のClickonceインストーラは、使用するシェルを知っていますか?

おかげで、私が何をしたか

答えて

1

Packaging APIを使用して、シェルUIにマッピングされているカスタムファイルの拡張子を作成しました。それは、パッケージをProgramData \ MyApp \ Extensionsフォルダに解凍するだけです。アプリが再起動すると、その部分が表示されます。

See this blog post for more info

  ' 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 
+0

注:梱包APIは、Windows XPで利用できない、とネット3.5 SP1以降です。 –

+0

私はAPIをWindows XPの制限の周りにOSを見つけて、それがxpの場合は、アプリケーションで手動で解凍しています。 –

+0

うわー、これがうまくいくなら、本当の勝者になるでしょう!私はPackaging APIを一度も使用していない(または見ています)ので、私が見ることができるサンプル/ドキュメントはありますか? – Mmarquee