Um diese Brücke zwischen Unmanaged und Managed Code zu schlagen, ist häufig zusätzlicher Aufwand notwendig. Es wird eine Art Kommunikationsschicht benötigt, die zwischen den unterschiedlichen „Welten“ vermittelt bzw. zumindest die Verbindung herstellt. Dafür haben wir in List & Label 23 eine solche Brücke geschaffen: die „Designer Object Bridge“. Mit ihr können eigene Designer-Objekte, die in .NET implementiert sind, nicht nur in der .NET Welt verwendet werden, sondern auch in der eigenen Unmanaged Welt, wie C++ oder Delphi. Da die Basis von List & Label in C++ geschrieben ist, basiert diese Brücke auf C++/CLI. Jetzt können damit sehr einfach eigene List & Label Designer-Objekte bequem in .NET implementiert und innerhalb der eigenen Anwendung genutzt bzw. an List & Label angemeldet werden. Um diese Anforderung zu demonstrieren, werden zwei Beispiele zur Verfügung gestellt, die im Folgenden näher beschrieben werden.
Internetmarke der Deutschen Post
Seit List & Label 22 ist es möglich, die Internetmarke der Deutschen Post zu verwenden – siehe auch den Blogpost zur Internetmarke. Bisher war es allerdings nur Managed (.NET) Applikationen vorbehalten, die Internetmarke der Deutschen Post mit dem List & Label .NET Assembly combit.ListLabel[>=22].Internetmarke zu verwenden. Doch durch die nun verfügbare Designer Object Bridge kann ab List & Label 23 die Internetmarke auch in eigenen Unmanaged Anwendungen genutzt werden.
TX Text Control
Die Verwendung von formatiertem Text über RTF ist eine häufige an List & Label gestellte Anforderung und kann von Haus aus mit dem installierten RTF Control von Microsoft realisiert werden. Allerdings gibt es hier für jede Version des Betriebssystems unterschiedliche Versionen dieses RTF Controls, die sich oft auch im Verhalten unterscheiden. Darüber hinaus sind häufig die Möglichkeiten begrenzt, insbesondere, wenn es um Tabellen geht. Hierzu haben wir in der Vergangenheit bereits das TX Text Control als bessere Alternative empfohlen – siehe hierzu auch den KB-Artikel KBAD001308. Auch hier galt bisher die Einschränkung, dass nur .NET Anwendungen vom RTF-Rendering des TX Text Controls profitieren konnten. Jetzt kann auch hier die Designer Object Bridge verwendet werden, um einer C++ oder Delphi Anwendung das .NET TX Text Control in List & Label zugänglich zu machen.
Designer Object Bridge
Wie die Implementierung eines solchen Designer-Objektes in .NET realisiert wird, damit die Designer Object Bridge es verwenden kann, entnehmen Sie detailliert dem aktualisierten Programmierbeispiel für das TX Text Control. Doch welche Schritte sind dann notwendig, um das eigene .NET Designer-Objekt mit der Designer Object Bridge zu verwenden?
1. Die Funktion ::LlSetOptionString() muss für die Option LL_OPTIONSTR_LLXPATHLIST(12) um den Eintrag für das Modul der Designer Object Bridge („combit.ListLabel.DesignerObjectBridge_x86.dll“ oder „combit.ListLabel.DesignerObjectBridge_x64.dll“ – je nach Bitness des verwendeten List & Label) erweitert werden:
... ::LlSetOptionString(hJob, LL_OPTIONSTR_LLXPATHLIST, _T("combit.ListLabel.DesignerObjectBridge_x86.dll")); ...
Damit wird in List & Label die C++/CLI Brücke geladen. Um nun der Designer Object Bridge mitzuteilen, welche .NET Module geladen/verwendet werden sollen, muss eine Konfigurationsdatei erstellt werden.
2. Die Konfigurationsdatei („combit.ListLabel.DesignerObjectBridge_x86.dll.config“ oder „combit.ListLabel.DesignerObjectBridge_x64.dll.config“ – je nach Bitness der verwendeten Designer Object Bridge) muss sich im gleichen Verzeichnis wie die Designer Object Bridge selbst befinden und den folgenden Aufbau haben:
<configuration> <assemblyPaths> <path value="<ToDo: path to the managed .NET assembly>" /> <path value="<ToDo: path to another managed .NET assembly>" /> ... </assemblyPaths> </configuration>
Beispiel, um die mitgelieferte Internetmarke als Designer-Objekt zu verwenden:
<configuration> <assemblyPaths> <path value=".combit.ListLabel23.Internetmarke.dll" /> </assemblyPaths> </configuration>
3. Soll das Designer-Objekt etwaige Optionen oder Parameter erhalten, können diese mittels der Funktion ::LlXSetParameter() gesetzt werden. Auf Seiten der .NET Implementierung müssen dann diese Optionen in der überschriebenen Methode OnSetOptionString() des Designer-Objektes entgegengenommen werden. Details dazu kann dem neuen Programmierbeispiel für das TX Text Control entnommen werden.
Beispiel für die Internetmarke:
... ::LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_OBJECT, _T("InternetmarkeObject"), _T("Internetmarke.PartnerId"), _T("<ToDo: Partner-ID>")); ::LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_OBJECT, _T("InternetmarkeObject"), _T("Internetmarke.KeyPhase"), _T("<ToDo: Key-Phase>")); ::LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_OBJECT, _T("InternetmarkeObject"), _T("Internetmarke.SignatureKey"), _T("<ToDo: Signature-Key")); ::LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_OBJECT, _T("InternetmarkeObject"), _T("Internetmarke.EulaText"), _T("<ToDo: optional EULA-Text")); ...
Beispiel für das TX Text Control:
... ::LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_OBJECT, _T("TXTextObjectName"), _T("TxTextControl.RecalcTableLayout"), _T("0")); ...
Zusammenfassung
Mit dem neuen Werkzeug „Designer Object Bridge“ können nun nach Belieben sehr einfach eigene Designer-Objekte in .NET implementiert werden und in der jeweiligen Unmanaged Anwendung einfach Verwendung finden
Daniel wurde bei combit zum Softwareentwickler ausgebildet und leitet als Manager den Customer Support. Neben der Softwareentwicklung betreut er auch technische Kooperationen mit Geschäftspartnern, hält Workshops für Entwickler und unterstützt das Sales- und Service-Team als Berater im technischen Bereich. In seiner Freizeit findet man ihn auf seinem Mountainbike oder Rennrad rund um den Bodensee und in den nahen Alpen. Er nimmt sich auch Zeit für chinesische Kampfkünste wie Wushu Kungfu und Taichi.