Step-by-Step into the cloud

a blog of Dirk Eisenberg (>)
posts - 81, comments - 15, trackbacks - 17

My Links

News

Article Categories

Archives

Post Categories

Image Galleries

Blogs

Projects

.NET Unmanaged API - Teil 1

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).
  • Share This Post:
  • Share on Twitter
  • Share on Facebook
  • Share on Technorati

Print | posted on Sunday, May 07, 2006 10:28 PM | Filed Under [ .NET Coding ]

Feedback

No comments posted yet.
Post A Comment
Title:
Name:
Email:
Website:
Comment:
Verification:
 
 

Powered by: