News combit Dev Blog

Eigene .NET Designer-Objekte in Unmanaged Code verwenden - Designer Object Bridge

Veröffentlicht: Freitag, 18. August 2017 | 0 Kommentar(e)
 
In Managed Code lassen sich oft viele Dinge deutlich einfacher und schneller implementieren, als es im Unmanaged Code wie bspw. Delphi oder C++ der Fall ist. Manchmal existieren bereits fertige .NET Module, die die gewünschte Anforderung enthalten, und diese sollen nun in der eigenen Unmanaged Anwendung zum Einsatz kommen. Aber: Wie macht man einem Unmanaged System ein .NET Modul zugänglich?

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.




Autor: Daniel Paepke
Consultant, Development & Cooperations

Daniel wurde bei combit zum Softwareentwickler ausgebildet. 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 knappen Freizeit findet man ihn auf seinem Mountainbike rund um den Bodensee und in den nahen Alpen.


 


Kommentare


Aktuell gibt es noch keine Kommentare zu diesem Blogbeitrag.

Ergänzen Sie hier Ihren Kommentar
 
 
 
 
 

Lassen Sie sich über neue Kommentare zu diesem Blogbeitrag informieren


 
RSS
combit Dev BlogRSS
combit Entwicklerblog
Hier teilen wir Informationen über die Entwicklung unserer Softwareprodukte. Außerdem: Allgemeines über die Softwareindustrie.
Archiv
November 2018 (2)
Oktober 2018 (4)
September 2018 (4)
August 2018 (2)
Juli 2018 (2)
Juni 2018 (2)
Mai 2018 (1)
April 2018 (1)
März 2018 (1)
Februar 2018 (2)
Januar 2018 (1)
Dezember 2017 (1)
November 2017 (2)
Oktober 2017 (3)
September 2017 (3)
August 2017 (2)
Juli 2017 (2)
Juni 2017 (1)
Mai 2017 (2)
April 2017 (1)
März 2017 (1)
Ältere Blogposts
Einträge aus dem Zeitraum von März 2014 bis Februar 2017 finden Sie in unserem englischsprachigen Blog.
+49 (0) 7531 90 60 10