Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Enthält Informationen zu einem einzelnen Attribut in einer Assembly und besteht aus drei DWORD
-Elementen. Jedes DWORD
-Element ist ein Offset in einen Zeichenpuffer, der von der CurrentIntoBuffer
-Methode der IEnumIDENTITY_ATTRIBUTE-Schnittstelle erstellt wird.
Syntax
typedef struct _IDENTITY_ATTRIBUTE_BLOB {
DWORD ofsNamespace;
DWORD ofsName;
DWORD ofsValue;
} IDENTITY_ATTRIBUTE_BLOB;
Member
Member | Beschreibung |
---|---|
ofsNamespace |
Der erste Offset in den Zeichenpuffer. Auf diesen Offset folgt nicht der Namespace des Attributs, sondern eine Reihe von NULL-Zeichen. Daher wird er nicht verwendet. |
ofsName |
Der zweite Offset in den Zeichenpuffer. Hier beginnt der Attributnamen. |
ofsValue |
Der dritte Offset in den Zeichenpuffer. Hier beginnt der Attributwert. |
Beispiel
Im folgenden Beispiel werden mehrere grundlegende Schritte veranschaulicht, die letztendlich eine aufgefüllte IDENTITY_ATTRIBUTE_BLOB
-Struktur ergeben:
Rufen Sie eine Identität vom Typ IReferenceIdentity für die Assembly ab.
Rufen Sie die
IReferenceIdentity::EnumAttributes
-Methode auf und anschließend ein Attribut vom Typ IEnumIDENTITY_ATTRIBUTE ab.Erstellen Sie einen Zeichenpuffer, und wandeln Sie ihn in eine
IDENTITY_ATTRIBUTE_BLOB
-Struktur um.Rufen Sie die
CurrentIntoBuffer
-Methode derIEnumIDENTITY_ATTRIBUTE
-Schnittstelle auf. Diese Methode kopiert die AttributeNamespace
,Name
undValue
in den Zeichenpuffer. Die drei Offsets für diese Zeichenfolgen werden in derIDENTITY_ATTRIBUTE_BLOB
-Struktur verfügbar.
// 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;
}
So führen Sie das Beispiel aus
C:\> EnumAssemblyAttributes.exe C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll
Beispielausgabe
Culture = neutral
name = System
processorArchitecture = MSIL
PublicKeyToken = b77a5c561934e089
Version = 2.0.0.0
Anforderungen
Plattformen: Informationen finden Sie unter Systemanforderungen.
Header: Isolation.h
.NET Framework-Versionen: Seit 2.0 verfügbar.