资源服务是用来管理资源和资源库的一种服务,它提供了四类API。
• 管理资源库的API
• 管理资源的API
• 管理资源数据的API
• 管理资源包的API
    在使用这些API时,经常要使用资源ID来指定一个被操作的资源。如果指定的是文档,那么资源ID的扩展名必须与资源类型一致。例如:如下的资源ID必须是一个指向地图定义的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    如果指定资源是文件夹,那么资源ID必须以“/”结尾。例如:
    $resourceID = new MgResourceIdentifier("Library://Geography/");1. 获取资源服务
    MapGuide中使用MgResourceService来代表资源服务。MgResourceService是一个接口,你无法直接创建MgResourceService的实例。如果大家看看MapGuide的源代码,你就会发现MapGuide使用了Singleton模式来创建MgResourceService。所以,我们必须使用方法MgSiteConnection::CreateService(…)来创建一个MgResourceService的实例,调用这个方法返回的结果始终是同一个MgResourceService的实例。如下的代码示意了如何获取一个资源服务。
    // 初始化WebTier
    MgInitializeWebTier('C://Inetpub//wwwroot//PhpMapAgent//webconfig.ini');
    // 创建到MapGuide站点服务器的一个连接
    $user = new MgUserInformation('Administrator', 'admin');
    $siteConnection = new MgSiteConnection();
    $siteConnection->Open($user);
    // 获取资源服务
    $resourceService = $siteConnection->CreateService(MgServiceType::ResourceService);
2. 头(Header)
    每个资源库和资源都有一个XML格式的头(Header),它包含了访问这些项目的权限设置信息。MapGuide包含了两种类型的头,ResourceFolderHeader和ResourceDocumentHeader。ResourceFolderHeader用于设置文件夹资源或资源库的权限,ResourceDocumentHeader用于设置其它类型资源的图标、权限和元数据。    如果使用下面的ResourceFolderHeader设置资源库或文件夹资源的权限,那么所有用户都可以读取和修改此资源库或文件夹资源。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceFolderHeader xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:noNamespaceSchemaLocation="ResourceFolderHeader-1.0.0.xsd">
        <Security>
            <Inherited>false</Inherited>
            <Groups>
                <Group>
                    <Name>Everyone</Name>
                    <Permissions>r,w</Permissions>
                </Group>
           </Groups>
       </Security>
    </ResourceFolderHeader>3. 管理资源库
    资源服务提供了获取和修改资源库内容和头的API。
3.1 获取资源库的内容
    方法GetRepositoryContent(…)用于获取指定资源库的内容。参数resource用于指定一个资源库,它可以是Library或Session资源库。返回值返回一个使用RepositoryContent XML Schema的XML字节流,它描述了指定资源库中的内容。
    MgByteReader GetRepositoryContent(MgResourceIdentifier resource);
    如下的代码示意了如何返回一个资源库的内容。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->GetRepositoryContent($resourceID);
    echo $byteReader->ToString();
3.2 获取资源库的头    方法GetRepositoryHeader(…)用于获取指定资源库的头。参数resource用于指定一个资源库。返回值是一个使用ReourceFolderHeader XML Schema的XML字节流,它描述了指定资源库的头。
    MgByteReader GetRepositoryHeader(MgResourceIdentifier resource);
    如下的代码示意了如何返回一个资源库的头。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->GetRepositoryHeader($resourceID);
    echo $byteReader->ToString();
3.3 更新资源库
    方法UpdateRepositoryHeader(…)用于更新指定资源库的内容和头部。参数resource用于指定一个资源库,参数content用于指定资源库的内容,参数header用于指定资源库的头部。    void UpdateRepository (MgResourceIdentifier resource, 
                                          MgByteReader content,
                                          MgByteReader header);
    如下的代码示意了如何更新资源库。
    $resourceID = new MgResourceIdentifier('Library://');
    $byteSource = new MgByteSource('C:DataRepositoryContent.xml');
    $byteReader = $byteSource->GetReader();
    $resourceService->UpdateRepository($resourceID, $byteReader, null);3.4 管理资源
    资源服务提供了API用于枚举资源及其所引用的资源,获取、修改资源的内容、头和元数据,拷贝、删除和移动资源等。
3.4.1 枚举资源
    方法EnumerateResources(…)用于枚举资源库中指定类型的资源。参数resource用于指定一个需要枚举的资源,它可以是一个资源文档,也可以是一个资源文件夹。参数depth用于相对于指定资源的递归深度。• 如果资源是一个文档,那么depth必须为0。
• 如果资源是一个文件夹: 
  
• 如果depth等于0,那么只返回指定文件夹的信息。
• 如果depth大于0,那么返回指定文件夹及其depth层子孙的信息。
• 如果depth等于-1,那么返回文件夹及其所有子孙的信息。
    参数type用于指定需要枚举的资源,它可以是MgResourceType中定义的任意一种资源类型。如果type设置为NULL,那么枚举所有的资源类型。返回值是一个使用ReourceList XML Schema的XML字节流,它描述了所有枚举得到的资源。
    MgByteReader* EnumerateResources(MgResourceIdentifier* resource,
                                                                INT32 depth, 
                                                                CREFSTRING type);
    如下的代码示意了如何结合不同的参数来枚举资源库中的资源。
    // 枚举Library资源库中的所有资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "");
    // 枚举Library资源库Geography文件夹下的所有资源,包含它的子文件夹下的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "");
    // 枚举Library资源库中的所有地图定义资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "MapDefinition");
    // 枚举Library资源库中的所有文件夹资源。
    $resourceID = new MgResourceIdentifier("Library://");
    $byteReader = $resourceService->EnumerateResources($resourceID, -1, "Folder");
    // 枚举Library资源库Geography文件夹资源,不包含文件夹下的资源。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, 0, "Folder");
    // 枚举Library资源库Geography文件夹,及文件夹下一层的所有地图定义资源,
    // 不包含文件夹下的文件夹下的资源。。
    $resourceID = new MgResourceIdentifier("Library://Geography/");
    $byteReader = $resourceService->EnumerateResources($resourceID, 1, "MapDefinition");
    // 枚举特定的地图定义资源。此时,depth必须设置为0。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->EnumerateResources($resourceID, 0, "MapDefinition");3.4.2 枚举引用
    方法EnumerateReferences(…)用于枚举引用了指定资源的所有资源。参数resource用于指定一个需要枚举其引用的资源。返回值是一个使用ReourceReferenceList XML Schema的XML字节流,它描述了资源的所有引用。
    MgByteReader EnumerateReferences(MgResourceIdentifier resource); 
    如下的代码示意了如何枚举资源的数据。
    $resourceID= new MgResourceIdentifier('Library://Samples/Sheboygan/Layers/BuildingOutlines.LayerDefinition');
    $byteReader = $resourceService->EnumerateReferences($resourceID);
    echo $byteReader->ToString();
    执行上面的代码,会得到类似如下的XML。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceReferenceList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:noNamespaceSchemaLocation="ResourceReferenceList-1.0.0.xsd">
        <ResourceId>Library://Samples/Sheboygan/Maps/Sheboygan.MapDefinition</ResourceId>
    </ResourceReferenceList>
3.4.3 获取资源相关的信息
    方法GetResourceContent(…)用于获取指定资源的内容。所有资源的内容都是XML格式的。对于不同类型的资源,它的XML Schema是不同的。你可以使用MgResourceIdentifier::GetResourceType ()得到资源类型,从而根据其相应的XML Schema分析和解释资源内容。
    MgByteReader GetResourceContent(MgResourceIdentifier resource);
    如下的代码示意了如何获取一个地图定义资源的内容。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->GetResourceContent($resourceID);
    方法GetResourceHeader(…)用于获取指定资源的头。返回值返回一个使用ReourceDocumentHeader XML Schema的XML字节流,它描述了指定资源的头。
    MgByteReader GetResourceHeader(MgResourceIdentifier resource);
    如下的代码示意了如何获取一个地图定义资源的头。
    $resourceID = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $byteReader = $resourceService->GetResourceHeader($resourceID);
    方法GetResourceMetadata(…)用于获取指定资源的元数据。返回值返回一个代表资源元数据的XML字节流。如果没有关联到资源的元数据,此方法返回NULL。一般情况下,我们使用FGDC 或ISO格式的元数据。大家可以到登录http://www.fgdc.gov/metadata和http://www.iso.org查看这两种元数据的具体格式。
    MgByteReader GetResourceMetadata(MgResourceIdentifier resource);
    方法GetResourceContent(…)用于检测指定资源是否已经存在。
    bool ResourceExists(MgResourceIdentifier resource);
3.4.4 设置资源
    方法SetResource(…)用于设置指定资源的内容和头。如果指定的资源不存在,则添加此资源;如果指定的资源已经存在,则更新此资源。参数resource用于指定一个资源。参数content用于指定资源的内容,如果不打算设置资源的内容,可以将其设置为NULL。参数header用于指定资源的头,这是一个使用了ReourceFolderHeader或ResourceDocumentHeader XML Schema的XML字节流。如果只是设置资源的内容,可以将header设置为NULL。这时,资源的权限设置继承于其父节点。
    void SetResource(MgResourceIdentifier resource, 
                                MgByteReader content,
                                MgByteReader header);
    下面,我们通过添加一个地图定义资源来示意如何添加一个资源。
    1. 准备资源内容。下例中的地图定义由两个图层Cities和Countries组成。
    <?xml version="1.0" encoding="UTF-8"?>
    <MapDefinition version="1.0.0">
       <Name>World</Name> 
       <Layers>
          <Layer>
             <Name>Cities</Name>
             <ResourceId>Library://World/Layers/Cities.Layer</ResourceId>
          </Layer>
          <Layer>
             <Name>Countries</Name>
             <ResourceId>Library://World/Layers/Countries.Layer</ResourceId>
          </Layer>
       </Layers>
    </MapDefinition>
    2. 准备资源头部。下例中,它的权限设置继承自其父节点。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceDocumentHeader 
      xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
      xsi:noNamespaceSchemaLocation="ResourceDocumentHeader-1.0.0.xsd">
        <Security>
            <Inherited>true</Inherited>
        </Security>
    </ResourceDocumentHeader>
    3. 添加资源。
    $resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $content  = "C:DataMapsWorld.MapDefinition";
    $content_byteSource = new MgByteSource($content);
    $content_byteSource->setMimeType("text/xml");
    $content_byteReader = $content_byteSource->GetReader();
    $header   = "C:DataMapsResourceDocumentHeader.xml";
    $header_byteSource = new MgByteSource($header);
    $header_byteSource->setMimeType("text/xml");
    $header_byteReader = $header_byteSource->GetReader();
    $resourceService->SetResource($resourceID, $content_byteReader, 
    $header_byteReader);
    4. 如果需要,添加资源所引用的其它资源。此例中,地图定义引用了其它两个图层定义资源。如果这两个资源没有添加到资源库中,我们必须使用类似的步骤将它们添加到资源库。
    5. 如果需要,设置资源数据。此例中,地图定义自身并不需要设置资源数据。但是,如果它所引用的图层定义没有设置相应的资源数据,那么我们需要为图层定义设置相应的资源数据。3.4.5 设置资源的元数据    方法SetResourceMetadata(…)用于设置指定资源的元数据。如果指定的资源不存在,那么此方法调用会失败。参数resource用于指定一个需要设置元数据的资源。参数content用于指定资源的元数据。如果设置resource为NULL,那么清除指定资源的元数据。MapGuide没有规定元数据的XML Schema,而是由用户自己来决定。MapGuide对这些元数据不做任何格式的检验,而是将其直接存储在资源库中。一般情况下,我们使用FGDC 或ISO格式的元数据。
    void SetResourceMetadata(MgResourceIdentifier resource, MgByteReader content);
3.4.6 删除资源
    方法DeleteResource(…)用于删除指定资源,及此资源的数据。参数resource用于指定一个需要删除的资源。如果指定的是一个资源文档,那么删除此资源文档。如果指定的是一个资源文件夹,那么此文件夹、此文件夹下的资源文档、此文件夹的子资源文件夹都会被删除。如果试图删除一个不存在的资源,那么此方法会抛出一个异常。
    void DeleteResource(MgResourceIdentifier resource);
    如下的代码示意了如何删除一个地图定义资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/World.MapDefinition");
    $resourceService->DeleteResource($resourceID);
    如下的代码示意了如何删除一个资源文件夹,及此文件夹下的其它资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/");
    $resourceService->DeleteResource($resourceID);
    如下的代码示意了如何删除资源库中的所有资源。
    $resourceID = new MgResourceIdentifier("Library://Maps/");
    $resourceService->DeleteResource($resourceID);
3.4.7 移动资源
    方法MoveResource(…)用于将一个已经存在的资源移到其它位置。参数sourceResource用于指定一个需要移动的资源,它既可以是一个文档,也可以是一个文件夹。如果指定一个资源文件夹,此方法亦拷贝文件夹下的资源。参数destResource用于指定移动的目标位置。参数overwrite用于决定在目标资源存在的情况下是否覆盖它。如果拷贝的是文件夹、 overwrite为真,且目标文件夹已经存在,那么只覆盖目标文件夹下具有相同文件夹名称的子文件夹,其它的文件夹保持原样。
    需要注意的是,此方法有一个缺陷。如果有一些资源引用了的被移动的资源,此方法不会更新这些引用。在MapGuide开源版2.2和MapGuide企业版2011中,此即将修正此缺陷。
    MgResourceIdentifier destResource, bool overwrite);  
    如下的代码示意了移动资源文档Library://Geography/World.MapDefinition到Library://Atlas/Oceans.MapDefinition。
    $oldPath = new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $newPath = new MgResourceIdentifier("Library://Atlas/Oceans.MapDefinition");
    $resourceService->MoveResource($oldPath, $newPath, true);
    如下的代码示意了移动资源文件夹Library://Geography/到Library://World Geography/。
    $oldPath = new MgResourceIdentifier("Library://Geography/");
    $newPath = new MgResourceIdentifier("Library://World Geography/");
    $resourceService->MoveResource($oldPath, $newPath, true);
    资源服务没有提供一个方法来重命名资源,因为MoveResource(…)就可以实现此功能。如下的代码示意了重命名资源Oceans.MapDefinition为Pacific Ocean.MapDefinition。
    $oldPath = new MgResourceIdentifier("Library://Atlas/Oceans.MapDefinition");
    $newPath = new MgResourceIdentifier("Library://Atlas/Pacific Ocean.MapDefinition");
    $resourceService->MoveResource($oldPath, $newPath, true);
3.4.8 拷贝资源
    方法RenameResourceData(…)用于拷贝指定的资源到其它位置。参数sourceResource用于指定一个需要拷贝的资源,它既可以是一个文档,也可以是一个文件夹。如果指定一个资源文件夹,此方法亦拷贝文件夹下的资源。参数destResource用于指定拷贝的目标位置。newDataName用于指定新的资源数据名称。参数overwrite用于决定在目标资源存在的情况下是否覆盖它。如果拷贝的是文件夹、 overwrite为真,且目标文件夹已经存在,那么只覆盖目标文件夹下具有相同文件夹名称的子文件夹,其它的文件夹保持原样。
    void CopyResource(MgResourceIdentifier sourceResource, 
    MgResourceIdentifier destResource, bool overwrite);
    如下的代码示意了拷贝资源文档Library://Geography/World.MapDefinition到Library://Atlas/World Geography.MapDefinition。
    $source_resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $destination_resourceID= new MgResourceIdentifier("Library://Atlas/World Geography.MapDefinition");
    $resourceService->CopyResource($source_resourceID, $destination_resourceID, true);
    如下的代码示意了拷资源文件夹Library://Geography/到Library://World/Oceans/。
    $source_resourceID= new MgResourceIdentifier("Library://Geography/");
    $destination_resourceID= new MgResourceIdentifier("Library://World/Oceans/");
    $resourceService->CopyResource($source_resourceID, $destination_resourceID, true);
3.4.9 设置资源权限
    通过方法SetResource(…)更新资源的头,可以改变资源的权限设置。但是,这种方式不是非常直观。所以,资源服务还提供了另外两个更为方便的方法。在使用如下两个方法时,必须以Administrator登录,或者登录用户是指定资源的主人(Owner)。通过调用EnumerateResources(…)可以获得资源的主人。
    void InheritPermissionsFrom(MgResourceIdentifier resource);
    void ChangeResourceOwner(MgResourceIdentifier resource, string owner, bool includeDescendants);
    方法InheritPermissionsFrom(…)用于设置指定资源文件夹的所有子孙继承此文件夹的权限设置。此方法只能使用于Library资源库,不可以用于Session资源库。参数resource必须指定一个文件夹资源。
    例如:文件夹Library://Geography/下包含一个地图定义资源和一个包含了两个要素源资源的文件夹,通过调用此方法会将此文件夹下的所有资源设置为“inherit”。
    $resourceID= new MgResourceIdentifier("Library://Geography/");
    $resourceService->InheritPermissionsFrom($resourceID);
    方法ChangeResourceOwner(…)用于改变指定资源的主人。参数source用于指定一个需要改变主人的资源,它既可以是一个文档,也可以是一个文件夹。参数owner用于指定新主人的用户ID。参数includeDescendants用于决定是否改变资源子孙的主人。只有在指定的资源是文件夹时,此参数才有意义。
如下的代码示意了如何改变一个资源的主人。
    $resourceID= new MgResourceIdentifier("Library://Geography/World.MapDefinition");
    $resourceService->ChangeResourceOwner($resourceID, "John Smith", false);
3.5 管理资源数据
    资源数据隶属于一个资源,资源使用不同的名称来区分不同的资源数据。所以,每个资源数据都有一个唯一的名称。
资源服务提供了API用于枚举、获取、添加、删除和重命名资源数据。3.5.1 枚举资源数据
    方法EnumerateResourceData(…)用于枚举指定资源的数据。参数resource用于指定一个需要枚举数据的资源。返回值是一个使用ReourceDataList XML Schema的XML字节流,它描述了所有枚举得到的资源数据。
    MgByteReader EnumerateResourceData(MgResourceIdentifier resource);
    如下的代码示意了如何枚举资源的数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $byteReader = $resourceService->EnumerateResourceData($resourceID);
    echo $byteReader->ToString();
    执行上面的代码,会得到类似如下的XML。
    <?xml version="1.0" encoding="UTF-8"?>
    <ResourceDataList xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance       xsi:noNamespaceSchemaLocation="ResourceDataList-1.0.0.xsd">
         <ResourceData>
             <Name>locations of points</Name>
             <Type>File</Type>
         </ResourceData>
    </ResourceDataList>
3.5.2 获取资源数据
    方法GetResourceData(…)用于枚举指定资源的数据。参数resource用于指定一个需要枚举数据的资源。dataName用于指定需要返回的资源数据的名称,这个名称是调用setResourceData(…)时所设置的名称。返回值是一个包含资源数据内容的字节流。
    MgByteReader GetResourceData(MgResourceIdentifier resource, String dataName);
    如下的代码示意了如何获取资源的数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $byteReader = $resourceService->GetResourceData($resourceID, "locations of points");
    $byteSink = new MgByteSink($byteReader);
    $byteSink->ToFile('C:temppoints.sdf');
3.5.3 设置资源数据
    方法SetResourceData(…)用于为指定资源的添加数据,它会将数据上传和存储到资源库。但是,它并不会进行任何数据转换的操作。参数resource用于指定一个需要设置数据的资源。参数dataName用于指定资源数据的名称,它可以是任何合法的UTF-8字符串。如果资源已经具有相同名称的数据,那么会覆盖掉资源库中已有的数据。如果资源数据名称为MgResourceDataName::UserCredentials,那么可以在资源的内容中插入标签MgResourceTag::Username和MgResourceTag::Password,这两个标签分别代表FDO Providers的用户名和密码,资源服务会使用资源数据中提供的认证信息替换它们。参数dataType用于指定资源数据的类型,它必须是类MgResourceDataType中预定义的某一类型。参数data用于指定数据。
    void SetResourceData(MgResourceIdentifier resource, string dataName, string dataType, MgByteReader data);
    如下的代码示意了如何设置资源数据,将其存储为文件。
    $resourceID = new MgResourceIdentifier('Library://Geography/Calgary.FeatureSource');
    $byteSource = new MgByteSource('C:DataCalgaryDataCalgary points.sdf');
    $data = $byteSource->GetReader();
    $resourceService->SetResourceData($resourceID, 'locations of points', 'File', $data);
    如下的代码示意了如何设置资源数据,将其存储为流。
    $resourceID = new MgResourceIdentifier('Library://Geography/Trees.SymbolLibrary');
    $byteSource = new MgByteSource('C:DataCalgaryDatamarkers.dwf');
    $data = $byteSource->GetReader();
    $resourceService->SetResourceData($resourceID, 'symbols for points', 'Stream', $data);
    如下的代码示意了如何为资源设置内嵌的认证信息,将其存储为字符串。当设置资源的内嵌的认证信息时,必须设置资源数据的名称为MgResourceDataName::UserCredentials,类型为字符串。
    $resourceID = new MgResourceIdentifier('Library://Geography/database connnection.FeatureSource');
    $byteSource = new MgByteSource('C:DataCalgaryDatacredentials.txt');
    $data = $byteSource->GetReader();
    $dataName = new MgResourceDataName();
    $resourceService->SetResourceData($resourceID, MgResourceDataName::UserCredentials, 'String', $data);
3.5.4 重命名资源数据
    方法RenameResourceData(…)用于重命名指定的资源数据。参数resource用于指定一个需要重命名数据的资源。oldDataName用于指定需要重命名的资源数据的名称。newDataName用于指定新的资源数据名称。Overwrite用于决定在目标资源数据存在的情况下是否覆盖它。
    void RenameResourceData(MgResourceIdentifier resource, String oldDataName,  String newDataName, bool overwrite);  
    如下的代码示意了如何重命名资源数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $resourceService->RenameResourceData($resourceID, "locations of points", "locations of historical sites", true);
3.5.5 删除资源数据
    方法DeleteResourceData(…)用于删除指定的资源数据。参数resource用于指定一个需要删除数据的资源。dataName用于指定需要删除的资源数据的名称。
    void DeleteResourceData(MgResourceIdentifier resource, String dataName);
    如下的代码示意了如何重命名资源数据。
    $resourceID = new MgResourceIdentifier("Library://Geography/Calgary.FeatureSource");
    $resourceService->DeleteResourceData($resourceID, "locations of points");
3.6 管理资源包    资源服务只提供了应用资源包的API,没有提供创建资源包的API。但是,MapGuide Studio提供了用户界面创建资源包,而且也提供了API来创建资源包。所以,如果需要可以使用MapGuide Studio来创建资源包。
    方法ApplyResourcePackage(…)用于应用资源包到Library资源库,它不支持Session资源库。此方法是一个原子操作,如果在应用资源包中的某一资源的时候执行失败,那么会回滚此前的所有修改。
    ApplyResourcePackage(MgByteReader resourcePackage);