DOC: 全局程序集缓存 (GAC) api 未在.net 框架软件开发工具包 (SDK) 文档中记录

文章翻译 文章翻译
文章编号: 317540 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

在本机代码应用程序编程接口 (api),您将可以进行交互的全局程序集缓存 (GAC) 没有记录在.net 框架软件开发工具包 (SDK) 文档中。

更多信息

注意: 不要使用这些 api 在您的应用程序中执行的程序集绑定或测试的程序集或其他运行的时,开发或设计时操作中是否存在。只有管理工具和安装程序必须使用这些 api。如果您使用 GAC,这直接公开您的应用程序程序集绑定脆弱性降到最低,或可能导致应用程序在.net Framework 的未来版本不正确地工作。

GAC 存储在计算机上的所有应用程序之间共享的程序集。实际存储位置和结构的 gac 中未记录和未来版本的.net 框架和 Microsoft Windows 操作系统中的更改。

访问程序集在 GAC 中唯一受支持的方法是通过在此文章中记录的 api。

大多数应用程序不必非要使用这些 api,因为程序集绑定由公共语言运行库自动执行。只有自定义安装程序或管理工具必须使用这些 api。Microsoft Windows 安装程序没有为安装到 GAC 的程序集的本机支持。

有关程序集和 gac 中的详细信息请参阅.net 框架 SDK。

在以下情况下,可以使用 GAC API:
  • 当您将程序集安装到 GAC 中。
  • 当您在 GAC 中移除程序集。
  • 当您在 GAC 中导出程序集。
  • 当您枚举可用在 GAC 中的程序集。
CoInitialize(Ex) 必须在调用之前您使用的任何函数和该规范中描述的接口。

IAssemblyCache 接口

IAssemblyCache 接口是顶级接口到 GAC 中提供的访问。

若要获取实例 CreateAssemblyCache API,调用 CreateAssemblyCache API,如下所示:
STDAPI CreateAssemblyCache(IAssemblyCache **ppAsmCache, DWORD dwReserved); 
参数的定义如下:
  • ppAsmCache-返回 IAssemblyCache 的指针
  • dwReserved

FUSION_INSTALL_REFERENCE 结构

FUSION_INSTALL_REFERENCE 结构表示此是当应用程序已安装在 GAC 中的程序集的引用。
    typedef struct _FUSION_INSTALL_REFERENCE_
    {
        DWORD  cbSize;
        DWORD  dwFlags;
        GUID   guidScheme;     // Contains one of the pre-defined GUIDs.
        LPCWSTR szIdentifier;  // Unique identifier for the application that installs this  assembly.
        LPCWSTR szNonCannonicalData;  // Data is description; relevant to the GUID above. 
    } FUSION_INSTALL_REFERENCE, *LPFUSION_INSTALL_REFERENCE;
				
,域结构的定义如下:
  • cbSize 的结构以字节为单位) 的大小。
  • dwFlags-保留,必须为零。
  • guidScheme-将引用添加的实体。
  • szIdentifier-标识安装该程序集的应用程序的唯一字符串。
  • szNonCannonicalData-仅添加该引用的实体可以理解的字符串。在 GAC 中只存储此字符串。
可能的值为 guidScheme 字段可以是下列值之一:
  • 通过使用 Windows 安装程序已安装的应用程序的引用 FUSION_REFCOUNT_MSI_GUID-程序集。szIdentifier 字段设置为 MSI,并且 szNonCannonicalData 设置到 Windows 安装程序。此方案必须仅由使用 Windows 安装程序本身。
  • FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID-程序集的应用程序出现在 $ 添加/删除程序 中的引用。szIdentifier 字段是用于注册 的添加/删除程序 的应用程序的令牌。
  • FUSION_REFCOUNT_FILEPATH_GUID-程序集都由文件系统中的文件的应用程序的引用。szIdentifier 字段是此文件路径。
  • FUSION_REFCOUNT_OPAQUE_STRING_GUID-程序集只由一个不透明的字符串表示的应用程序的引用。szIdentifier 是此不透明的字符串。GAC 不执行检查的不透明的引用,当您删除这存在。

ASSEMBLY_INFO 结构

ASSEMBLY_INFO 结构表示程序集缓存中的程序集有关的信息。

结构的字段定义如下:
  • cbAssemblyInfo 的结构以字节为单位) 的大小。在.net Framework 的未来版本中允许添加结构的内容。
  • dwAssemblyFlags-指示一个或多个 ASSEMBLYINFO_FLAG_ * 位。
  • uliAssemblySizeInKB-构成该程序集,以千字节为单位) 的文件的大小 (KB)。
  • pszCurrentAssemblyPathBuf-保存当前的包含构成该程序集文件的目录路径的字符串缓冲区的指针。路径必须以零结尾。
  • cchBuf-pszCurrentAssemblyPathBug 字段指向缓冲区的大小。
dwAssemblyFlags 可以具有下列值之一:
  • ASSEMBLYINFO_FLAG__INSTALLED-表示实际安装该程序集。总是设置在当前版本的.net 框架中。
  • ASSEMBLYINFO_FLAG__PAYLOADRESIDENT-从不设置在当前版本的在.net 框架。

IAssemblyCache::UninstallAssembly 方法

IAssemblyCache::UninstallAssembly 方法中移除程序集的引用,GAC 中。如果其他应用程序不保存到程序集的任何其他引用,GAC 中删除构成程序集文件。
    HRESULT UninstallAssembly(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName, 
        [in] LPCFUSION_INSTALL_REFERENCE pRefData, 
        [out, optional] ULONG *pulDisposition
        );

				
该参数定义,如下所示:
  • dwFlags-未定义的标志。必须为零。
  • pszAssemblyName-程序集的名称。零终止的 Unicode 字符串。
  • pRefData-FUSION_INSTALL_REFERENCE 结构的指针。尽管这不推荐此参数可以为 null。程序集的安装没有一个应用程序的引用,或所有现有的应用程序引用会消失。
  • pulDisposition-为一个整数,该整数指示函数执行的操作的指针。
: 如果不为空 pulDispositionpulDisposition 包含下列值之一:
  • IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED-程序集的文件已删除 GAC 中。
  • IASSEMBLYCACHE_UNINSTALL_DISPOSITION_STILL_IN_USE-应用程序正在使用该程序集。在 Microsoft Windows 95 和 Microsoft Windows 98 上,则返回此值。
  • 在 GAC 中不存在 IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED-程序集。
  • IASSEMBLYCACHE_UNINSTALL_DISPOSITION_DELETE_PENDING-未使用。
  • 未 GAC 中卸下 IASSEMBLYCACHE_UNINSTALL_DISPOSITION_HAS_INSTALL_REFERENCES-程序集,因为存在另一个应用程序引用。
  • 在 GAC 中找不到 IASSEMBLYCACHE_UNINSTALL_DISPOSITION_REFERENCE_NOT_FOUND-pRefData 中指定的引用。
返回的值定义如下:
  • S_OK-程序集已被卸载。
  • S_FALSE-操作成功,但 GAC 中未删除该程序集。原因是 pulDisposition 中所述。

IAssemblyCache::QueryAssemblyInfo 方法

IAssemblyCache::QueryAssemblyInfo 方法 GAC 中检索有关程序集的信息。
    HRESULT QueryAssemblyInfo(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName,
        [in, out] ASSEMBLY_INFO *pAsmInfo
        );
				
该参数定义,如下所示:
  • dwFlags-QUERYASMINFO_FLAG_VALIDATEQUERYASMINFO_FLAG_GETSIZE 之一:
    • * _VALIDATE-包括哈希验证和强名称签名验证在程序集清单对在 GAC 中执行验证的文件。
    • * _GETSIZE-返回程序集 (占用磁盘空间) 中的所有文件的大小。 如果这没有指定 ASSEMBLY_INFO::uliAssemblySizeInKB 字段不会修改。
  • pszAssemblyName-查询的程序集的名称。
  • pAsmInfo-返回 ASSEMBLY_INFO 结构的指针。

IAssemblyCache::InstallAssembly 方法

IAssemblyCache::InstallAssembly 方法将新的程序集添加到 GAC 中。程序集必须保留在文件系统中,并且被复制到 GAC 中。
    HRESULT InstallAssembly( // If you use this, fusion will do the streaming & commit.
        [in] DWORD dwFlags,
        [in] LPCWSTR pszManifestFilePath, 
        [in] LPCFUSION_INSTALL_REFERENCE pRefData
        );
				
参数定义如下:
  • 可以指定 dwFlags-最大,IASSEMBLYCACHE_INSTALL_FLAG_ * 值的位之一:
    • * _REFRESH-如果程序集已安装在 GAC 中和正在安装该程序集的文件版本号都相同或更高版本,文件将被替换。
    • * _FORCE_REFRESH-不管其版本号覆盖的现有程序集文件。
  • pszManifestFilePath-指向该动态链接库 (DLL) 包含程序集清单的字符串。其他程序集文件必须位于包含程序集清单的 DLL 所在的同一目录中。
  • pRefData-FUSION_INSTALL_REFERENCE,指示应用程序的名义安装程序集的指针。尽管这不推荐此参数可以是空的但这会使没有任何应用程序引用程序集。

IAssemblyName 接口

IAssemblyName 接口表示程序集名称。程序集名称包括一组预定义的名称 / 值对。在.net 框架 SDK 中详细介绍了程序集名称。
[
        local,
        object,
        uuid(CD193BC0-B4BC-11d2-9833-00C04FC31D2E),
        pointer_default(unique)
]
interface IAssemblyName: IUnknown
				
通过调用 CreateAssemblyNameObject API 获得 IAssemblyName 的实例:
STDAPI CreateAssemblyNameObject(LPASSEMBLYNAME *ppAssemblyNameObj, LPCWSTR szAssemblyName, DWORD dwFlags, LPVOID pvReserved);
参数定义如下:
  • ppAssemblyNameObj-接收 IAssemblyName 指针所创建的内存位置的指针。
  • szAssemblyName-或由 dwFlags 确定一个完全的程序集引用的程序集名称的字符串表示。字符串表示形式可以为 null。
  • dwFlags-零或多个 CREATE_ASM_NAME_OBJ_FLAGS 枚举中定义的位。
  • pvReserved-必须是空的。

CREATE_ASM_NAME_OBJ_FLAGS 枚举

CREATE_ASM_NAME_OBJ_FLAGS 枚举包含下列值:
  • CANOF_PARSE_DISPLAY_NAME-如果指定此标志,则 szAssemblyName 参数是一个完整的程序集名称,然后经过语法分析各个属性。如果不指定该标志,则 szAssemblyName 将是程序集名称的"名称"部分。
  • CANOF_SET_DEFAULT_VALUES-如果此标志为指定的某些属性例如处理器结构设置为它们的默认值。
    typedef enum {
         CANOF_PARSE_DISPLAY_NAME = 0x1,
         CANOF_SET_DEFAULT_VALUES = 0x2
    } CREATE_ASM_NAME_OBJ_FLAGS;
				

ASM_NAME 枚举

ASM_NAME 枚举属性 ID 描述程序集名称中的名称 / 值对的有效名称。请参阅.net 框架 SDK 有关这些属性的说明。
    typedef enum
    {
        ASM_NAME_PUBLIC_KEY = 0,
        ASM_NAME_PUBLIC_KEY_TOKEN,
        ASM_NAME_HASH_VALUE,
        ASM_NAME_NAME,
        ASM_NAME_MAJOR_VERSION,
        ASM_NAME_MINOR_VERSION,
        ASM_NAME_BUILD_NUMBER,
        ASM_NAME_REVISION_NUMBER,
        ASM_NAME_CULTURE,
        ASM_NAME_PROCESSOR_ID_ARRAY,
        ASM_NAME_OSINFO_ARRAY,
        ASM_NAME_HASH_ALGID,
        ASM_NAME_ALIAS,
        ASM_NAME_CODEBASE_URL,
        ASM_NAME_CODEBASE_LASTMOD,
        ASM_NAME_NULL_PUBLIC_KEY,
        ASM_NAME_NULL_PUBLIC_KEY_TOKEN,
        ASM_NAME_CUSTOM,
        ASM_NAME_NULL_CUSTOM,                
        ASM_NAME_MVID,
        ASM_NAME_MAX_PARAMS
    } ASM_NAME;
				

IAssemblyName::SetProperty 方法

IAssemblyName::SetProperty 方法将名称 / 值对添加到程序集名称或者,如果已存在具有相同名称的名称-值对,修改或删除的名称-值对的值。
    HRESULT SetProperty(
        [in]    DWORD  PropertyId, 
        [in]    LPVOID pvProperty,
        [in]    DWORD  cbProperty);
				
该参数定义,如下所示:
  • PropertyId-类型的值,该值代表要添加或要修改的名称-值对中的名称部分的 ID。有效的属性 id 是 ASM_NAME 枚举中定义的。
  • pvProperty-一个指向包含该属性的值的缓冲区的指针。
  • cbProperty-pvProperty 缓冲区以字节为单位) 的长度。如果 cbProperty 为零,名称 / 值对被从程序集名称。

IAssemblyName::GetProperty 方法

IAssemblyName::GetProperty 方法检索指定名称的程序集名称中的名称-值对的值。
    HRESULT GetProperty(
        [in]         DWORD    PropertyId, 
        [out]        LPVOID   pvProperty,
        [in, out]    LPDWORD  pcbProperty);
				
该参数定义,如下所示:
  • PropertyId-的 ID 类型的值,该值代表的值是要检索的名称-值对的名称。指定的属性 id 是 ASM_NAME 枚举中定义的。
  • pvProperty-将包含该属性的值的缓冲区的指针。
  • cbProperty-在 pvProperty 缓冲区以字节为单位) 的长度。

IAssemblyName::Finalize 方法

IAssemblyName::Finalize 方法冻结程序集名称。调用此方法后,还要调用 IAssemblyName::SetProperty 会成功。
HRESULT Finalize();

IAssemblyName::GetDisplayName 方法

IAssemblyName::GetDisplayName 方法返回程序集名称的字符串表示形式。
    HRESULT  GetDisplayName(
        [out]       LPOLESTR  szDisplayName,
        [in, out]   LPDWORD   pccDisplayName,
        [in]        DWORD     dwDisplayFlags);
				
该参数定义,如下所示:
  • szDisplayName-要包含在显示名称缓冲区的指针。在 Unicode 中返回该显示名称。
  • pccDisplayName-中输入) 上的字符缓冲区的大小。该返回显示名称 (在返回) 的长度。
  • dwDisplayFlags-一个或多个 ASM_DISPLAY_FLAGS 枚举中定义的数据位:
    • * _VERSION-该显示名称中包括版本号。
    • * _CULTURE-包括区域性。
    • * _PUBLIC_KEY_TOKEN-包括公钥标记。
    • * _PUBLIC_KEY-包括公钥。
    • * _CUSTOM-包含程序集名称的自定义的一部分。
    • * _PROCESSORARCHITECTURE-包括处理器体系结构。
    • * _LANGUAGEID-包括语言 id。
    typedef enum
    {
        ASM_DISPLAYF_VERSION    = 0x1,
        ASM_DISPLAYF_CULTURE    = 0x2,
        ASM_DISPLAYF_PUBLIC_KEY_TOKEN = 0x4,
        ASM_DISPLAYF_PUBLIC_KEY = 0x8,
        ASM_DISPLAYF_CUSTOM     = 0x10,
        ASM_DISPLAYF_PROCESSORARCHITECTURE = 0x20,
        ASM_DISPLAYF_LANGUAGEID     = 0x40

    } ASM_DISPLAY_FLAGS;
				

IAssemblyName::GetName 方法

IAssemblyName::GetName 方法返回程序集名称的名称部分。
    HRESULT GetName(
        [in, out] LPDWORD lpcwBuffer,
        [out] WCHAR *pwzName);
				
该参数定义,如下所示:
  • lpcwBuffer-(输入) 上 pwszName 缓冲区的大小。(在返回) 名称的长度。
  • pwszName-到将包含程序集名称的名称部分的缓冲区的指针。

IAssemblyName::GetVersion 方法

IAssemblyName::GetVersion 方法返回程序集名称的版本部分。
HRESULT GetVersion(
        [out] LPDWORD pdwVersionHi,
        [out] LPDWORD pdwVersionLow);
				
该参数定义,如下所示:
  • pdwVersionHi-到一个 dword 包含版本号的高 32 位的值的指针。
  • pdwVersionLow-到一个 dword 包含版本号的低 32 位的值的指针。

IAssemblyName::IsEqual 方法

IAssemblyName::IsEqual 方法比较程序集名称对另一个程序集名称。
    HRESULT IsEqual(
        [in] IAssemblyName *pName,
        [in] DWORD dwCmpFlags);
				
该参数定义,如下所示:
  • pName-要进行比较的程序集名称。
  • dwCmpFlags-表示程序集名称在比较中使用的哪一部分。
值是一个或多个 ASM_CMP_FLAGS 枚举中定义的数据位:
    typedef enum
    {
        ASM_CMPF_NAME            = 0x1,
        ASM_CMPF_MAJOR_VERSION   = 0x2,
        ASM_CMPF_MINOR_VERSION   = 0x4,
        ASM_CMPF_BUILD_NUMBER    = 0x8,
        ASM_CMPF_REVISION_NUMBER = 0x10,
        ASM_CMPF_PUBLIC_KEY_TOKEN = 0x20,
        ASM_CMPF_CULTURE         = 0x40,
        ASM_CMPF_CUSTOM          = 0x80,
        ASM_CMPF_ALL = ASM_CMPF_NAME | ASM_CMPF_MAJOR_VERSION | ASM_CMPF_MINOR_VERSION |
                       ASM_CMPF_REVISION_NUMBER | ASM_CMPF_BUILD_NUMBER |
                       ASM_CMPF_PUBLIC_KEY_TOKEN | ASM_CMPF_CULTURE | ASM_CMPF_CUSTOM,
        // For strongly named assemblies, ASM_CMPF_DEFAULT==ASM_CMPF_ALL.
        // For simply named assemblies, this is also true. However, when
        // performing IAssemblyName::IsEqual, the build number/revision 
        // number will be removed from the comparison.
        ASM_CMPF_DEFAULT = 0x100
    } ASM_CMP_FLAGS;                       
				
的返回值如下所示:
  • S_OK:-根据与比较条件匹配的名称。
  • S_FALSE:-名称不匹配。

IAssemblyName::Clone 方法

IAssemblyName::Clone 方法创建程序集名称的一个副本。
    HRESULT Clone(
        [out] IAssemblyName **pName);
				

IAssemblyEnum 接口

IAssemblyEnum 接口枚举 GAC 中的程序集。
 [
        local,
        object,
        uuid(21b8916c-f28e-11d2-a473-00c04f8ef448),
        pointer_default(unique)
]
interface IAssemblyEnum : IUnknown
				
若要获取实例 CreateAssemblyEnum API,调用 CreateAssemblyNameObject API,如下所示:
STDAPI CreateAssemblyEnum(IAssemblyEnum **pEnum, IUnknown *pUnkReserved, IAssemblyName *pName, DWORD dwFlags, LPVOID pvReserved);
参数的定义如下:
  • pEnum-包含 IAssemblyEnum 指针的内存位置的指针。
  • pUnkReserved-必须是空的。
  • pName-用于筛选枚举的程序集名称。可以为 null 以枚举 GAC 中的所有程序集。
  • dwFlags-正好有一个位从 ASM_CACHE_FLAGS 枚举。
  • pvReserved-必须是 NULL。

ASM_CACHE_FLAGS 枚举

ASM_CACHE_FLAGS 枚举包含下列值:
  • ASM_CACHE_ZAP-枚举预编译的程序集的缓存通过使用 Ngen.exe。
  • ASM_CACHE_GAC-枚举 gac。
  • ASM_CACHE_DOWNLOAD-枚举程序集的已下载的按需或的已被影像复制。
IAssemblyName::GetDisplayName
typedef enum
{
    ASM_CACHE_ZAP            = 0x1,
    ASM_CACHE_GAC            = 0x2,
    ASM_CACHE_DOWNLOAD       = 0x4
} ASM_CACHE_FLAGS;
				

IAssemblyEnum::GetNextAssembly 方法

IAssemblyEnum::GetNextAssembly 方法枚举在 GAC 中的程序集。
    HRESULT GetNextAssembly
    (
        [in]                  LPVOID                pvReserved,
        [out]                 IAssemblyName       **ppName,
        [in]                  DWORD                 dwFlags
    );
				
该参数定义,如下所示:
  • pvReserved-必须是空的。
  • ppName-接收程序集名称枚举的下一个程序集的接口指针的内存位置的指针。
  • dwFlags-必须为零。

IInstallReferenceItem 接口

IInstallReferenceItem 接口表示已在 GAC 中的程序集设置的引用。可通过 IInstallReferenceEnum 接口来返回 IInstallReferenceIteam 的实例。
[
        local,
        object,
        uuid(582dac66-e678-449f-aba6-6faaec8a9394),
        pointer_default(unique)
]
interface IInstallReferenceItem : IUnknown
				

IInstallReferenceItem::GetReference 方法

IInstallReferenceItem::GetReference 方法返回 FUSION_INSTALL_REFERENCE 结构。
    HRESULT GetReference
    (
    [out] LPFUSION_INSTALL_REFERENCE *ppRefData,
    [in]  DWORD dwFlags,
    [in]  LPVOID pvReserved
    );
				
该参数定义,如下所示:
  • ppRefData-FUSION_INSTALL_REFERENCE 结构的指针。内存 GetReference 方法分配和释放 IInstallReferenceItem 时将被释放。释放 IInstallReferenceItem 对象之后,调用方必须不持有对此缓冲区的引用。
  • dwFlags-必须为零。
  • pvReserved-必须是空的。

IInstallReferenceEnum 接口

IInstallReferenceEnum 接口枚举 GAC 中的程序集上设置的所有引用。

: 属于该程序集的引用都将被锁定,更改这些引用将被枚举。
[
        local,
        object,
        uuid(56b1a988-7c0c-4aa2-8639-c3eb5a90226f),
        pointer_default(unique)
]
interface IInstallReferenceEnum : IUnknown
				
若要获取实例 CreateInstallReferenceEnum API,调用 CreateInstallReferenceEnum API,如下所示:
STDAPI CreateInstallReferenceEnum(IInstallReferenceEnum **ppRefEnum, IAssemblyName *pName, DWORD dwFlags, LPVOID pvReserved);
参数的定义如下:
  • ppRefEnum-接收 IInstallReferenceEnum 指针的内存位置的指针。
  • pName-用于枚举引用的程序集名称。
  • dwFlags-必须为零。
  • pvReserved-必须是空的。

IInstallReferenceEnum::GetNextInstallReferenceItem 方法

IInstallReferenceEnum::GetNextInstallReferenceItem 返回程序集的下一次的参考信息。
    HRESULT GetNextInstallReferenceItem
            (
            [out] IInstallReferenceItem **ppRefItem,
            [in]  DWORD dwFlags,
            [in]  LPVOID pvReserved
            );
				
该参数定义,如下所示:
  • ppRefItem-接收 IInstallReferenceItem 指针的内存位置的指针。
  • dwFlags-必须为零。
  • pvReserved-必须是空的。
返回值如下所示:
  • S_OK: 的下一项,则返回成功。
  • S_FALSE:-没有更多的项目。

GetCachePath API

GetCachePath API 返回在 gac 中的存储位置。
STDAPI GetCachePath(ASM_CACHE_FLAGS dwCacheFlags, LPWSTR pwzCachePath, PDWORD pcchPath);
该参数定义,如下所示:
  • dwCacheFlags-正好有一个位 ASM_CACHE_FLAGS 枚举中定义。
  • pwzCachePath-要接收的 Unicode 字符串的形式 GAC 路径的缓冲区的指针。
  • pcchPath 的 Unicode 字符中的该 pwszCachePath 缓冲区的长度。
// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
//+---------------------------------------------------------------------------
// 
//  Microsoft Windows
//  File:       fusion.idl
// 
//  Contents:   Fusion Interfaces
// 
//  Classes:
// 
//  Functions:
// 
// 
//----------------------------------------------------------------------------
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// fusion.h")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("// Copyright (c) Microsoft Corporation.  All rights reserved.")
cpp_quote("//")
cpp_quote("// THIS CODE AND INFORMATION IS PROVIDED \"AS IS\" WITHOUT WARRANTY OF")
cpp_quote("// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO")
cpp_quote("// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A")
cpp_quote("// PARTICULAR PURPOSE.")
cpp_quote("//=--------------------------------------------------------------------------=")
cpp_quote("")
cpp_quote("#ifdef _MSC_VER")
cpp_quote("#pragma comment(lib,\"uuid.lib\")")
cpp_quote("#endif")
cpp_quote("")
cpp_quote("//---------------------------------------------------------------------------=")
cpp_quote("// Fusion Interfaces.")
cpp_quote("")

import "objidl.idl";

cpp_quote("#ifdef _MSC_VER")
cpp_quote("#pragma once")
cpp_quote("#endif")

interface IAssemblyCache;
interface IAssemblyCacheItem;
interface IAssemblyName;
interface IAssemblyEnum;


typedef enum
{
    ASM_CACHE_ZAP            = 0x1,
    ASM_CACHE_GAC            = 0x2,
    ASM_CACHE_DOWNLOAD       = 0x4
} ASM_CACHE_FLAGS;

/////////////////////////////////////////////////////////////////////////////// 
// 
// IAssemblyCache
// 
/////////////////////////////////////////////////////////////////////////////// 

[
        local,
        object,
        uuid(e707dcde-d1cd-11d2-bab9-00c04f8eceae),
        pointer_default(unique)
]
interface IAssemblyCache : IUnknown
{
    cpp_quote("// {8cedc215-ac4b-488b-93c0-a50a49cb2fb8}")
    cpp_quote("DEFINE_GUID(FUSION_REFCOUNT_UNINSTALL_SUBKEY_GUID, 0x8cedc215, 0xac4b, 0x488b, 0x93, 0xc0, _
0xa5, 0x0a, 0x49, 0xcb, 0x2f, 0xb8);")
    cpp_quote("")
    cpp_quote("// {b02f9d65-fb77-4f7a-afa5-b391309f11c9}")
    cpp_quote("DEFINE_GUID(FUSION_REFCOUNT_FILEPATH_GUID, 0xb02f9d65, 0xfb77, 0x4f7a, 0xaf, 0xa5, 0xb3, 0x91, _
0x30, 0x9f, 0x11, 0xc9);")
    cpp_quote("")
    cpp_quote("// {2ec93463-b0c3-45e1-8364-327e96aea856}")
    cpp_quote("DEFINE_GUID(FUSION_REFCOUNT_OPAQUE_STRING_GUID, 0x2ec93463, 0xb0c3, 0x45e1, 0x83, 0x64, 0x32, _
0x7e, 0x96, 0xae, 0xa8, 0x56);")

    cpp_quote(" // {25df0fc1-7f97-4070-add7-4b13bbfd7cb8} // this GUID cannot be used for installing into GAC.")
    cpp_quote("DEFINE_GUID(FUSION_REFCOUNT_MSI_GUID,  0x25df0fc1, 0x7f97, 0x4070, 0xad, 0xd7, 0x4b, 0x13, 0xbb, 0xfd, _
0x7c, 0xb8); ")


    typedef struct _FUSION_INSTALL_REFERENCE_
    {
        DWORD  cbSize;
        DWORD  dwFlags;
        GUID   guidScheme; // contains one of the pre-defined guids.
        LPCWSTR szIdentifier;  // unique identifier for app installing this  assembly.
        LPCWSTR szNonCannonicalData;  // data is description; relevent to the guid above 
    } FUSION_INSTALL_REFERENCE, *LPFUSION_INSTALL_REFERENCE;

    typedef const FUSION_INSTALL_REFERENCE  *LPCFUSION_INSTALL_REFERENCE;


    typedef struct _ASSEMBLY_INFO
    {
        ULONG cbAssemblyInfo; // size of this structure for future expansion
        DWORD dwAssemblyFlags;
        ULARGE_INTEGER uliAssemblySizeInKB;
        LPWSTR pszCurrentAssemblyPathBuf;
        ULONG   cchBuf; // size of path buf.
    } ASSEMBLY_INFO;

    cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_REFRESH       (0x00000001)")
    cpp_quote("#define IASSEMBLYCACHE_INSTALL_FLAG_FORCE_REFRESH (0x00000002)")

    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_UNINSTALLED (1)")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_STILL_IN_USE (2)")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_ALREADY_UNINSTALLED (3)")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_DELETE_PENDING (4)")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_HAS_INSTALL_REFERENCES (5)")
    cpp_quote("#define IASSEMBLYCACHE_UNINSTALL_DISPOSITION_REFERENCE_NOT_FOUND (6)")

    cpp_quote("#define QUERYASMINFO_FLAG_VALIDATE        (0x00000001)")
    cpp_quote("#define QUERYASMINFO_FLAG_GETSIZE         (0x00000002)")

    // these flags are for dwAssemblyFlags field in struct _ASSEMBLY_INFO  
    cpp_quote("#define ASSEMBLYINFO_FLAG_INSTALLED       (0x00000001)")
    cpp_quote("#define ASSEMBLYINFO_FLAG_PAYLOADRESIDENT (0x00000002)")

    HRESULT UninstallAssembly(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName, 
        [in] LPCFUSION_INSTALL_REFERENCE pRefData, 
        [out, optional] ULONG *pulDisposition
        );
 
    HRESULT QueryAssemblyInfo(
        [in] DWORD dwFlags,
        [in] LPCWSTR pszAssemblyName,
        [in, out] ASSEMBLY_INFO *pAsmInfo
        );
 
    HRESULT CreateAssemblyCacheItem( 
        [in] DWORD dwFlags,
        [in] PVOID pvReserved,
        [out] IAssemblyCacheItem **ppAsmItem,
        [in, optional] LPCWSTR pszAssemblyName  // uncanonicalized, comma separated name=value pairs.
        );
        
    HRESULT CreateAssemblyScavenger
    (
        [out]   IUnknown **ppUnkReserved
    );

    HRESULT InstallAssembly( // if you use this, fusion will do the streaming & commit.
        [in] DWORD dwFlags,
        [in] LPCWSTR pszManifestFilePath, 
        [in] LPCFUSION_INSTALL_REFERENCE pRefData
        );

}


/////////////////////////////////////////////////////////////////////////////// 
// 
// IAssemblyCacheItem
// 
/////////////////////////////////////////////////////////////////////////////// 

[
        local,
        object,
        uuid(9e3aaeb4-d1cd-11d2-bab9-00c04f8eceae),
        pointer_default(unique)
]
interface IAssemblyCacheItem : IUnknown
{
    cpp_quote("#define STREAM_FORMAT_COMPLIB_MODULE    0")
    cpp_quote("#define STREAM_FORMAT_COMPLIB_MANIFEST  1")
    cpp_quote("#define STREAM_FORMAT_WIN32_MODULE      2")
    cpp_quote("#define STREAM_FORMAT_WIN32_MANIFEST    4")
    
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_REFRESH       (0x00000001)")
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_FLAG_FORCE_REFRESH (0x00000002)")
    
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_INSTALLED (1)") // first time install
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_REFRESHED (2)") // overwrite, if existing
    cpp_quote("#define IASSEMBLYCACHEITEM_COMMIT_DISPOSITION_ALREADY_INSTALLED (3)") // existing, 
    

    HRESULT CreateStream(
        [in] DWORD dwFlags,                         // For general API flags
        [in] LPCWSTR pszStreamName,                 // Name of the stream to be passed in
        [in] DWORD dwFormat,                        // format of the file to be streamed in.
        [in] DWORD dwFormatFlags,                   // format-specific flags
        [out] IStream **ppIStream,
        [in, optional] ULARGE_INTEGER *puliMaxSize  // Max size of the Stream.
        );
 
    HRESULT Commit
    (
        [in] DWORD dwFlags, // For general API flags like IASSEMBLYCACHEITEM _COMMIT_FLAG_REFRESH 
        [out, optional] ULONG *pulDisposition
    ); 
 
    HRESULT AbortItem(); // If you have created IAssemblyCacheItem and don't plan to use it, its good idea to call 
    AbortItem before releasing it.

}



/////////////////////////////////////////////////////////////////////////////// 
// 
// IAssemblyName
// 
/////////////////////////////////////////////////////////////////////////////// 

[
        local,
        object,
        uuid(CD193BC0-B4BC-11d2-9833-00C04FC31D2E),
        pointer_default(unique)
]
interface IAssemblyName: IUnknown
{
    typedef [unique] IAssemblyName *LPASSEMBLYNAME;
    
    typedef enum {
         CANOF_PARSE_DISPLAY_NAME = 0x1,
         CANOF_SET_DEFAULT_VALUES = 0x2
    } CREATE_ASM_NAME_OBJ_FLAGS;
    
    typedef enum
    {
        ASM_NAME_PUBLIC_KEY = 0,
        ASM_NAME_PUBLIC_KEY_TOKEN,
        ASM_NAME_HASH_VALUE,
        ASM_NAME_NAME,
        ASM_NAME_MAJOR_VERSION,
        ASM_NAME_MINOR_VERSION,
        ASM_NAME_BUILD_NUMBER,
        ASM_NAME_REVISION_NUMBER,
        ASM_NAME_CULTURE,
        ASM_NAME_PROCESSOR_ID_ARRAY,
        ASM_NAME_OSINFO_ARRAY,
        ASM_NAME_HASH_ALGID,
        ASM_NAME_ALIAS,
        ASM_NAME_CODEBASE_URL,
        ASM_NAME_CODEBASE_LASTMOD,
        ASM_NAME_NULL_PUBLIC_KEY,
        ASM_NAME_NULL_PUBLIC_KEY_TOKEN,
        ASM_NAME_CUSTOM,
        ASM_NAME_NULL_CUSTOM,                
        ASM_NAME_MVID,
        ASM_NAME_MAX_PARAMS
    } ASM_NAME;
    
    typedef enum
    {
        ASM_DISPLAYF_VERSION    = 0x1,
        ASM_DISPLAYF_CULTURE    = 0x2,
        ASM_DISPLAYF_PUBLIC_KEY_TOKEN = 0x4,
        ASM_DISPLAYF_PUBLIC_KEY = 0x8,
        ASM_DISPLAYF_CUSTOM     = 0x10,
        ASM_DISPLAYF_PROCESSORARCHITECTURE = 0x20,
        ASM_DISPLAYF_LANGUAGEID     = 0x40

    } ASM_DISPLAY_FLAGS;
    
    typedef enum
    {
        ASM_CMPF_NAME            = 0x1,
        ASM_CMPF_MAJOR_VERSION   = 0x2,
        ASM_CMPF_MINOR_VERSION   = 0x4,
        ASM_CMPF_BUILD_NUMBER    = 0x8,
        ASM_CMPF_REVISION_NUMBER = 0x10,
        ASM_CMPF_PUBLIC_KEY_TOKEN = 0x20,
        ASM_CMPF_CULTURE         = 0x40,
        ASM_CMPF_CUSTOM          = 0x80,
        ASM_CMPF_ALL = ASM_CMPF_NAME | ASM_CMPF_MAJOR_VERSION | ASM_CMPF_MINOR_VERSION |
                       ASM_CMPF_REVISION_NUMBER | ASM_CMPF_BUILD_NUMBER |
                       ASM_CMPF_PUBLIC_KEY_TOKEN | ASM_CMPF_CULTURE | ASM_CMPF_CUSTOM,
        // For strongly named assemblies, ASM_CMPF_DEFAULT==ASM_CMPF_ALL.
        // For simply named assemblies, this is also true, however, when
        // performing IAssemblyName::IsEqual, the build number/revision 
        // number will be removed from the comparision.
        ASM_CMPF_DEFAULT = 0x100
    } ASM_CMP_FLAGS;                       

    HRESULT SetProperty(
        [in]    DWORD  PropertyId, 
        [in]    LPVOID pvProperty,
        [in]    DWORD  cbProperty);

    HRESULT GetProperty(
        [in]         DWORD    PropertyId, 
        [out]        LPVOID   pvProperty,
        [in, out]    LPDWORD  pcbProperty);

    HRESULT Finalize();

    HRESULT  GetDisplayName(
        [out]       LPOLESTR  szDisplayName,
        [in, out]   LPDWORD   pccDisplayName,
        [in]        DWORD     dwDisplayFlags);

    HRESULT BindToObject(
        [in]      REFIID               refIID,
        [in]      IUnknown            *pUnkSink, 
        [in]      IUnknown            *pUnkContext,
        [in]      LPCOLESTR            szCodeBase,
        [in]      LONGLONG             llFlags,
        [in]      LPVOID               pvReserved,
        [in]      DWORD                cbReserved,
        [out]     LPVOID               *ppv);


    HRESULT GetName(
        [in, out] LPDWORD lpcwBuffer,
        [out] WCHAR *pwzName);
        
    HRESULT GetVersion(
        [out] LPDWORD pdwVersionHi,
        [out] LPDWORD pdwVersionLow);

    HRESULT IsEqual(
        [in] IAssemblyName *pName,
        [in] DWORD dwCmpFlags);
        
    HRESULT Clone(
        [out] IAssemblyName **pName);
        

}

/////////////////////////////////////////////////////////////////////////////// 
// 
// IAssemblyEnum
// 
/////////////////////////////////////////////////////////////////////////////// 
[
        local,
        object,
        uuid(21b8916c-f28e-11d2-a473-00c04f8ef448),
        pointer_default(unique)
]
interface IAssemblyEnum : IUnknown
{

    HRESULT GetNextAssembly
    (
        [in]                  LPVOID                pvReserved,
        [out]                 IAssemblyName       **ppName,
        [in]                  DWORD                 dwFlags
    );

    HRESULT Reset(void);

    HRESULT Clone 
    (
        [out] IAssemblyEnum **ppEnum
    );
    
}


/////////////////////////////////////////////////////////////////////////////// 
// 
// IInstallReferenceItem
// 
/////////////////////////////////////////////////////////////////////////////// 

[
        local,
        object,
        uuid(582dac66-e678-449f-aba6-6faaec8a9394),
        pointer_default(unique)
]
interface IInstallReferenceItem : IUnknown
{
    HRESULT GetReference
    (
    [out] LPFUSION_INSTALL_REFERENCE *ppRefData,
    [in]  DWORD dwFlags,
    [in]  LPVOID pvReserved
    );
}

/////////////////////////////////////////////////////////////////////////////// 
// 
// IInstallReferenceEnum
// 
/////////////////////////////////////////////////////////////////////////////// 

[
        local,
        object,
        uuid(56b1a988-7c0c-4aa2-8639-c3eb5a90226f),
        pointer_default(unique)
]
interface IInstallReferenceEnum : IUnknown
{
    HRESULT GetNextInstallReferenceItem
            (
            [out] IInstallReferenceItem **ppRefItem,
            [in]  DWORD dwFlags,
            [in]  LPVOID pvReserved
            );
}

#pragma midl_echo("STDAPI CreateInstallReferenceEnum(IInstallReferenceEnum **ppRefEnum, IAssemblyName *pName, DWORD dwFlags, _
LPVOID pvReserved);      ")
#pragma midl_echo("STDAPI CreateAssemblyEnum(IAssemblyEnum **pEnum, IUnknown *pUnkReserved, IAssemblyName *pName, DWORD dwFlags, _
LPVOID pvReserved);      ") 
#pragma midl_echo("STDAPI CreateAssemblyNameObject(LPASSEMBLYNAME *ppAssemblyNameObj, LPCWSTR szAssemblyName, DWORD dwFlags, _
LPVOID pvReserved);             ")
#pragma midl_echo("STDAPI CreateAssemblyCache(IAssemblyCache **ppAsmCache, DWORD dwReserved); ")
#pragma midl_echo("STDAPI GetCachePath(ASM_CACHE_FLAGS dwCacheFlags, LPWSTR pwzCachePath, PDWORD pcchPath); ")
				

属性

文章编号: 317540 - 最后修改: 2003年4月4日 - 修订: 3.0
这篇文章中的信息适用于:
  • Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2
  • Microsoft .NET Framework Software Development Kit 1.0 Service Pack 2
关键字:?
kbmt kbbug kbdocerr kbpending KB317540 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 317540
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。
不再更新的 KB 内容免责声明
本文介绍那些 Microsoft 不再提供支持的产品。因此本文按“原样”提供,并且不再更新。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com