Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save kekyo/4cd7ac5a6462e4cf66e13f8ec8207937 to your computer and use it in GitHub Desktop.
Save kekyo/4cd7ac5a6462e4cf66e13f8ec8207937 to your computer and use it in GitHub Desktop.
How to retreive assembly metadatas without loading .NET CLR (http://eternalwindows.jp/unmanaged/metadata/metadata03.html)
#include "stdafx.h"
#include <windows.h>
#include <mscoree.h>
#include <cor.h>
int _tmain(int argc, _TCHAR* argv[])
{
IMetaDataDispenser *pMetaDataDispenser;
IMetaDataAssemblyImport *pMetaDataAssemblyImport;
HRESULT hr;
ULONG i, uCount;
mdAssemblyRef assemblyRefs[2048];
WCHAR szName[256];
HCORENUM hCorEnum;
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_CorMetaDataDispenser, 0, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenser, (void **)&pMetaDataDispenser);
if (FAILED(hr)) {
CoUninitialize();
return 0;
}
hr = pMetaDataDispenser->OpenScope(
L"D:\\PROJECT\\CenterCLR.NamingFormatter\\CenterCLR.NamingFormatter.PCL1\\bin\\Debug\\CenterCLR.NamingFormatter.dll",
ofRead,
IID_IMetaDataAssemblyImport,
(IUnknown **)&pMetaDataAssemblyImport);
if (FAILED(hr)) {
pMetaDataDispenser->Release();
CoUninitialize();
return 0;
}
hCorEnum = NULL;
pMetaDataAssemblyImport->EnumAssemblyRefs(&hCorEnum, assemblyRefs, sizeof(assemblyRefs), &uCount);
for (i = 0; i < uCount; i++) {
pMetaDataAssemblyImport->GetAssemblyRefProps(assemblyRefs[i], NULL, NULL, szName, 256, NULL, NULL, NULL, NULL, NULL);
MessageBoxW(NULL, szName, L"OK", MB_OK);
}
pMetaDataAssemblyImport->Release();
pMetaDataDispenser->Release();
CoUninitialize();
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment