.NET中的包关系的目的是什么?

时间:2010-12-12 15:45:44

标签: c# .net package relationship

.NET中的包关系(ZipPackage)究竟是什么?我知道什么是包,但我无法理解关系的目的。你能举例说明我什么时候想要使用它们以及它们有什么用处吗?

3 个答案:

答案 0 :(得分:1)

来自MSDN(套餐类):

  

Package是一个抽象类,可用于将对象组织成具有已定义物理格式的单个实体,以实现可移植性和高效访问。

  

PackageRelationship(“relationship”)定义源包或PackagePart与目标对象之间的关联。 PackageRelationship可以是两种类型中的一种,每种类型可以是以下两种形式之一:

* A package-level relationship (created by the Package.CreateRelationship method) relates a Package to either:
      o A target part in the package.
      o A target resource outside the package.
* A part-level relationship (created by the PackagePart.CreateRelationship method) relates a source PackagePart to either:
      o Another target part in the package.
      o A target resource outside the package.

因此,在创建Package时,如果要指示对象与包的另一部分之间存在关系,则应使用PackageRelationship来指示它与何种关系是

还可以使用ZipPackage来处理Open Office XML文件 - 在这个用例中,有时可以指示对象之间的关系。请参阅here

答案 1 :(得分:0)

基本上是将它们连接在一起以便它们被部署,更重要的是同时不部署。

比如说你有一个程序,你有一个它使用的GIF包。然后,您希望在安装程序时可以使用GIF,并且希望在卸载程序时清除它们。

答案 2 :(得分:0)

我认为file formats using OPC都是很好的例子

在c#中,一个带有预览图像的opc容器示例将实现为:

using System.IO.Compression;
using System.IO.Packaging;

using (var package = Package.Open( your_Zip/OPC_File_Path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
    // Add the Preview Image to the OPC container
    var imagePart = package.CreatePart( PackUriHelper.CreatePartUri(new Uri("preview.png", UriKind.Relative)), "image/png");
    package.CreateRelationship( imagePart.Uri, TargetMode.Internal, OpcConstants.RelationshipTypes.PREVIEWIMAGE, "preview");

    using(var imageStream = imagePart.GetStream( FileMode.Open, FileAccess.Write ))
    {
        imageStream.Write( your_preview_Image_Byte_array, 0, your_preview_Image_Byte_array.Length);
    }
}


   private byte[] GetPreviewImage(System.IO.Packaging.Package package)
   {
        if (!package.RelationshipExists("preview"))
        {
            return null;
        }

        var previewRel = package.GetRelationship("preview");
        var previewUri = PackUriHelper.CreatePartUri(previewRel.TargetUri);

        var previewImagePart = package.GetPart(previewUri);
        using (var previewImageStream = previewImagePart.GetStream(FileMode.Open, FileAccess.Read))
        using (var ms = new MemoryStream())
        {
            previewImageStream.CopyTo(ms);
            return ms.ToArray();
        }
    }

要将您的png转换为字节数组,您可以执行this

这样做的好处是,之后您可以使用定义的Relationship-Id(=“ preview”)来访问opc容器中的PreviewImage