Geeks With Blogs
Step-by-Step into the cloud a blog of Dirk Eisenberg (>)
puh, schon wieder sind einige Wochen vergangen und ich habe nix zu diesem Blog beigetragen. Diese Woche hatte ich dann ein Erlebnis was mich zum Bloggen nötigt. Wie der Titel schon verrät, soll es um einen Teil des .NET Frameworks gehen, der nicht unbedingt gut dokumentiert ist und den Name "Unmanaged API" trägt. Die Unmanaged .NET Api stellt ein Set von COM-Interfaces zur Verfügung um auf die Meta-Daten eines .NET-Assemblies aus native Code heraus zuzugreifen. Eine Populärer Anwendung dieser API ist Visual Studio 2005 selbst. Viele Funktionen die sich sonst in System.Reflection befinden, sind ebenfalls über diese Schnittstelle erreichbar. Schauen wir uns ein Beispiel an, das prüft ob die gegebene Datei ein gültiges .NET Assembly ist:
HRESULT hr = CoCreateInstance(	CLSID_CorMetaDataDispenser, 0, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenser, 						(LPVOID*)&pIMetaDataDispenser);
if (SUCCEEDED(hr))
{
 mdAssembly asmToken;
 hr = pIMetaDataDispenser->OpenScope(	L"MyAssemblyImage", ofRead, IID_IMetaDataAssemblyImport, (LPUNKNOWN*)&pIMetaDataAssemblyImport); 
 hr = pIMetaDataAssemblyImport->GetAssemblyFromScope(&asmToken);
 
 bool bIsAssembly = false;
 if (SUCCEEDED(hr))
  bIsAssembly = true;  
}
Eigentlich spricht der Code für sich, zuerst benötigen wir eine Instanz des MetaDataDispenser wodurch wir Zugriff auf alle Metadaten-Tabellen erhalten. Jetzt ist es möglich auf die verschiedenen Bereiche zuzugreifen. In diesem Beispiel auf die Meta-Daten in denen die Referenzen auf andere Assemblies zu finden sind. Um zu erkennen ob es ein gültiges Assembly ist, wird der Seiteneffekt genutzt das jedes Assembly diese Tabelle besitzt und das Öffnen dieses Scopes nur bei native-Binaries nicht funktioniert. Randbemerkung: Die Unmanaged API steht nur auf Computern zur Verfügung auf denen auch ein .NET-Framework installiert ist. Viele der unterstützten Funktionen werden ab .NET 1.0 unterstützt. Die benötigte include Datei "cor.h" findet sich in den Headern des .NET-Frameworks und muss eingebunden werden. Dabei wird indirekt die Datei specstrings.h angezogen. Diese steht erst in einem der letzten SDKs zur Verfügung (ich nutze das Windows 2003 Server SP1 SDK). Posted on Sunday, May 7, 2006 10:28 PM .NET Coding | Back to top


Comments on this post: .NET Unmanaged API - Teil 1

No comments posted yet.
Your comment:
 (will show your gravatar)


Copyright © Dirk Eisenberg | Powered by: GeeksWithBlogs.net