Einzelnen Beitrag anzeigen

XDev

Registriert seit: 28. Jan 2006
5 Beiträge
 
Delphi 2006 Architect
 
#2

Re: VCL.NET DLL deployen

  Alt 25. Okt 2007, 14:56
Das ist aber auch ein hübsches Thema ...

In irgendeinem Kontext wurde Nick Hodges vor erst kurzer Zeit von irgendwem genau darauf angesprochen und antwortete sinngemäß: "Jaaaaa, da werden wir dann demnächst was tun". (Super: Kaum gibt es Delphi.Net in der 4.Generation, kommt man schon auf die richtigen Ideen...)

Hilft Dir nix, gell ... ???

Es kommt aber noch besser: Mittel- bis langfristig wirst Du nicht nur die Assemblies der Vcl.Net, sondern auch weitere Assemblies von anderen Herstellern benötigen, die Du aber selbst distributieren mußt.

Ganz prinzipiell solltest Du Dich deshalb (möglichst intensiv) mit der Thematik "AssemblyBinding" in der Dokumentation zum .Net-Framework (SDK) befassen.


Es hat mehrere Möglichkeiten:

1. Installiere die gesamte Vcl.Net im GAC

Unter [Programme\CommonFiles\CodeGear Shared\RAD Studio\Shared Assemblies\5.0] hast Du für den Fall von Delphi 2007 .Net (installiert unter Vista) die Redistributables der Vcl.Net liegen. (Gilt analog für D2006/D2005, heisst dann halt irgendwie anders, insbesondere hieß die Firma da noch "Borland").

Versuche irgendwie, das Ganze im GAC des Zielrechners zu installieren.
Vor allen Dingen: Lass mich dann wissen, wie es Dir gelungen ist und wie glücklich Du damit bist. (Ich hatte damit herumexperimentiert und fand es - irgendwie komisch...)


2. Nimm einfach alles und verbringe es in das Arbeitsverzeichnis Deiner Anwendung

Sollte eigentlich klappen müssen. Ich selbst würde so allerdings nicht verfahren und empfehle es Dir auch nicht.


3. Verwendung eine AppConfig-Datei mit "Probing"

Das ist einer der aufwändigeren Wege (den ich persönlich allerdings dennoch für einfacher halte). Finde IRGENDWIE (Delphi, Reflection) heraus, welche Assemblies Du benötigst (oder nimm einfach alle) und separiere sie in einem Unterverzeichnis unterhalb (!!!) des Vz Deiner Executable.

Das hier angewendete Verfahren nennt sich "Probing", sinngemäß erstellst Du eine AppConfig-Datei folgenden Inhaltes:

<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="HIER_DIE_VCL_NET_ASSEMBLIES"/>
</assemblyBinding>
</runtime>
</configuration>

Das funktioniert so - definitiv, ich habe es 1 1/2 Jahre lang erfolgreich so gehalten.


3. Verwendung einer AppConfig-Datei mit "CodeBase"

Also, da bin ich jetzt angekommen. Und zwar deshalb, weil nicht nur meine eigene Exe, sondern auch eine fremde Exe meine Assemblies binden soll. Mit "Probing" kann man leider nur Assemblies addressieren, welche sich in einem Unterverzeichnis befinden (und ich schlage jeden tot, der seine Exe in "mein" Directory hineingibt). "CodeBase" ermöglicht die Addressierung von Assemblies in irgendeinem Verzeichnis (Vorsicht aber mit der Zonensicherheit, wenn das dann ein Netzwerk-Laufwerk sein soll!)

"CodeBase" ist EIGENTLICH ziemlich genial, aber der Preis ist schon recht hoch: Die Assemblies müssen signiert sein und man (ich) kommt ziemlich schnell ziemlich durcheinander. Warum, das magst Du an folgendem Schnippel erkennen:

<configuration>
<runtime>
<gcConcurrent enabled="false"/>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity name="Borland.Delphi" publicKeyToken="91d62ebb5b0d1b1b" culture="neutral" />
<codeBase version="11.0.5000.9245" href="file:///[HIER_DAS_ASSEMBLY_DIR]\Borland.Delphi.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Borland.Vcl" publicKeyToken="91d62ebb5b0d1b1b" culture="neutral" />
<codeBase version="11.0.5000.9245" href="file:///[HIER_DAS_ASSEMBLY_DIR]\Borland.Vcl.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
<codeBase version="0.85.1.271" href="file:///[HIER_DAS_ASSEMBLY_DIR]\ICSharpCode.SharpZipLib.dll"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="ManagedVCL.Data" publicKeyToken="825c3d8d507009dd" culture="neutral" />
<codeBase version="1.0.0.0" href="file:///[HIER_DAS_ASSEMBLY_DIR]\ManagedVCL.Data.dll"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

Wie auch immer, ein echt hübsches Thema.
Ich hoffe, ich konnte jetzt wenigstens die Tür zeigen, durch die Du da hindurchgehen mußt ...

Oder Du wartest halt, bis CodeGear dann doch noch eine eigene Lösung präsentiert (die Dir dann aber mit fremden Assemblies immer noch nicht weiterhilft).

Gruß,
Werner
  Mit Zitat antworten Zitat