次の方法で共有


IDENTITY_ATTRIBUTE_BLOB 構造体

アセンブリの 1 つの属性についての情報を格納し、3 つの DWORD で構成されます。 各 DWORD は、IEnumIDENTITY_ATTRIBUTE インターフェイスの CurrentIntoBuffer メソッドで生成される文字バッファーへのオフセットです。

typedef struct _IDENTITY_ATTRIBUTE_BLOB {
    DWORD  ofsNamespace;
    DWORD  ofsName;
    DWORD  ofsValue;
}   IDENTITY_ATTRIBUTE_BLOB;

メンバー

メンバー

説明

ofsNamespace

文字バッファーへの最初のオフセット。 このオフセットの後には、属性の名前空間ではなく、一連の null 文字が続きます。 したがって使用されません。

ofsName

文字バッファーへの第 2 のオフセット。 この場所は、属性名の開始位置を示します。

ofsValue

文字バッファーへの第 3 のオフセット。 この場所は、属性値の開始位置を示します。

サンプル

次の例では、最終的に IDENTITY_ATTRIBUTE_BLOB 構造体が設定されるいくつかの基本的な手順を示します。

  1. アセンブリの IReferenceIdentity を取得します。

  2. IReferenceIdentity::EnumAttributes メソッドを呼び出し、IEnumIDENTITY_ATTRIBUTE を取得します。

  3. 文字バッファーを作成し、IDENTITY_ATTRIBUTE_BLOB 構造体としてキャストします。

  4. IEnumIDENTITY_ATTRIBUTE インターフェイスの CurrentIntoBuffer メソッドを呼び出します。 このメソッドは、Namespace、Name、および Value の各属性を文字バッファーにコピーします。 これらの文字列に対する 3 つのオフセットが、IDENTITY_ATTRIBUTE_BLOB 構造体で使用できるようになります。

// EnumAssemblyAttributes.cpp : main project file.

#include "stdafx.h"

#include "fusion.h"
#include "windows.h"
#include "stdio.h"
#include "mscoree.h"
#include "isolation.h"

typedef HRESULT (__stdcall *PFNGETREF)(LPCWSTR pwzFile, REFIID riid, IUnknown **ppUnk);
typedef HRESULT (__stdcall *PFNGETAUTH)(IIdentityAuthority **ppIIdentityAuthority);

PFNGETREF                   g_pfnGetAssemblyIdentityFromFile = NULL;
PFNGETAUTH                  g_pfnGetIdentityAuthority = NULL;
IUnknown                    *g_pUnk = NULL;

bool Init()
{
    HRESULT     hr = S_OK;
    DWORD       dwSize = 0;
    bool        bRC = false;
    
    hr = CorBindToRuntimeEx(NULL, L"wks", 0, CLSID_CorRuntimeHost,
                           IID_ICorRuntimeHost, (void **)&g_pUnk);
    if(FAILED(hr)) {
        printf("Error: Failed to initialize CLR runtime! hr = 0x%0x\n",
                hr);
        goto Exit;
    }
   
    if (SUCCEEDED(hr)) {
        hr = GetRealProcAddress("GetAssemblyIdentityFromFile",
                         (VOID **)&g_pfnGetAssemblyIdentityFromFile);
    }

    if (SUCCEEDED(hr)) {
        hr = GetRealProcAddress("GetIdentityAuthority",
                                (VOID **)&g_pfnGetIdentityAuthority);
    }

    if (!g_pfnGetAssemblyIdentityFromFile || 
        !g_pfnGetIdentityAuthority)
    {
        printf("Error: Cannot get required APIs from fusion.dll!\n");
        goto Exit;
    }

    bRC = true;

Exit:
    return bRC;
}

void Shutdown()
{
    if(g_pUnk) {
        g_pUnk->Release();
        g_pUnk = NULL;
    }
}

void Usage()
{
    printf("EnumAssemblyAttributes: A tool to enumerate the identity 
            attributes of a given assembly.\n\n");
    printf("Usage: EnumAssemblyAttributes AssemblyFilePath\n");
    printf("\n");
}

int _cdecl wmain(int argc, LPCWSTR argv[])
{
    int     iResult = 1;
    IUnknown                    *pUnk  = NULL;
    IReferenceIdentity          *pRef  = NULL;
    HRESULT                     hr     = S_OK;   
    IEnumIDENTITY_ATTRIBUTE     *pEnum = NULL;
    BYTE                        abData[1024];
    DWORD                       cbAvailable;
    DWORD                       cbUsed;
    IDENTITY_ATTRIBUTE_BLOB     *pBlob;

    if(argc != 2) {
        Usage();
        goto Exit;
    }

    if(!Init()) {
        printf("Failure initializing EnumIdAttr.\n");
        goto Exit;
    }

    hr = g_pfnGetAssemblyIdentityFromFile(argv[1], 
                            __uuidof(IReferenceIdentity), &pUnk);

    if (FAILED(hr)) {
        printf("GetAssemblyIdentityFromFile failed with hr = 0x%x", 
                hr);
        goto Exit;
    }

    hr = pUnk->QueryInterface(__uuidof(IReferenceIdentity), 
                              (void**)&pRef);
    if (FAILED(hr)) {
        goto Exit;
    }

    hr = pRef->EnumAttributes(&pEnum);
    if (FAILED(hr)) {
        printf("IReferenceIdentity::EnumAttributes failed with hr = 
                0x%x", hr);
        goto Exit;
    }

    pBlob = (IDENTITY_ATTRIBUTE_BLOB *)(abData);
    while (1) {
        cbAvailable = sizeof(abData);
        hr = pEnum->CurrentIntoBuffer(cbAvailable, abData, &cbUsed);
        if (FAILED(hr)) {
            printf("IEnumIDENTITY_ATTRIBUTE::CurrentIntoBuffer failed 
                    with hr = 0x%x", hr);
            goto Exit;
        }

        if (! cbUsed) {
            break;
        }

        LPWSTR pwzNameSpace = (LPWSTR)(abData + pBlob->ofsNamespace);
        LPWSTR pwzName      = (LPWSTR)(abData + pBlob->ofsName);
        LPWSTR pwzValue     = (LPWSTR)(abData + pBlob->ofsValue);
        printf("%ws: %ws = %ws\n", pwzNameSpace, pwzName, pwzValue);

        hr = pEnum->Skip(1);
        if (FAILED(hr)) {
            printf("IEnumIDENTITY_ATTRIBUTE::Skip failed with hr = 
                    0x%x", hr);
            goto Exit;
        }
    }

    iResult = 0;

Exit:

    Shutdown();

    if (pUnk) {
        pUnk->Release();
    }

    if (pRef) {
        pRef->Release();
    }

    if (pEnum) {
        pEnum->Release();
    }

    return iResult;
}

サンプルを実行するには

C:\> EnumAssemblyAttributes.exe C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll

出力例

Culture = neutral

name = System

processorArchitecture = MSIL

PublicKeyToken = b77a5c561934e089

Version = 2.0.0.0

必要条件

プラットフォーム : 「.NET Framework システム要件」を参照

ヘッダー : Isolation.h

.NET Framework のバージョン : 4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0

参照

参照

IReferenceIdentity インターフェイス

IEnumIDENTITY_ATTRIBUTE インターフェイス

IDENTITY_ATTRIBUTE 構造体

その他の技術情報

Fusion 構造体