cool IT Team-Blog

Einbetten von 32- und 64-bit managed-C++ DLLs in .net Projekte mit AnyCPU

Um Komponenten, die in managed-C++ implementiert wurden, in einer .net-Anwendung nutzen zu können, muss berücksichtigt werden, dass managed-C++ immer für 32- oder 64-bit übersetzt wird.

.net-Anwendungen (z.B. in C# oder VB.net) können auch für "Any CPU" übersetzt werden, wodurch das Programm am Zielsystem für das Betriebssystem optimiert wird. Auf einem 64-bit System werden so die 64-bit genutzt, auf einem 32-bit System ist die Applikation aber (als 32-bit Applikation) verfügbar ohne 2 getrennte Versionen erstellen zu müssen.

Soll jetzt eine Komponente, welche in managed-C++ erstellt wurde (z.B. ein Wrapper für eine unmanaged-C++ Bibliothek) genutzt werden, so kann diese nicht direkt eingebunden werden. Es gibt aber Möglichkeiten in .net, um dieses Problem zu umgehen. Dazu sind folgende Schritte notwendig:
  1. Definition eines Interfaces für die Komponente
  2. Implementierung des Interfaces in managed-C++
  3. Übersetzen der managed-C++ Komponente in 32- und in 64-bit
    hier ist zu beachten, dass die erstellten DLLs unterschiedliche Namen erhalten müssen (z.B. Api32.dll und Api64.dll)
    um 2 unterschiedliche Klassennamen zu erhalten, ohne den Quelltext anpassen zu müssen, kann für C++ ein #define für den Klassennamen definiert werden, der z.B. bei 32-bit CApi=CApi32 und bei 64-bit CApi=CApi64 lautet.
  4. Nutzen de Komponente nur über das Interface
  5. In einer statischen (in VB.net shared) Methode mit Try/Catch zunächst versuchen die 64-bit Komponente zu nutzen. Falls dies Fehlschlägt, die 32-bit Komponente nutzen.

Falls die managed-C++ Komponente selbst weitere DLLs lädt, die für 32- und 64-bit zwar unterschiedlich sind, aber den gleichen Namen haben, so müssen alle diese Dateen in ein Unterverzeichnis mit dem Namen der managed-C++ Komponente abgelegt werden. Beim laden der Komponente sucht die .net-Applikation im Verzeichnis der Applikation oder in entsprechenden Unterverzeichnissen. Hier ein Beispiel:
 MyApp.exe
   Unterverzeichnis Api32 enthält: Api32.dll, 3rdParty.dll (32-bit)
   Unterverzeichnis Api64 enthält: Api64.dll, 3rdParty.dll (64-bit
)
Ist doch cool, oder?
Verfasst: 30.05.2011 14:47:25 von
Tags: .net, managed-C++

1


Kommentare
Für diesen Blogbeitrag liegen zurzeit keine Kommentare vor.
Einen Kommentar schreiben



 Security code