Announcement

Collapse
No announcement yet.

Assembly, dll, Resource und Co

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Assembly, dll, Resource und Co

    Hallo
    Ich versuche grade was ich alles in VCL gemacht habe in delphi.net (FCL) umzusetzen.
    Ich habe gerne immer mit Resourcen gearbeitet und würde es weiter tun. nur wie?
    in mein Programmorder habe ich ein Ordner "sprachen"
    ich habe einigen txt.files
    dort steht z.b
    1=datei
    2=hallo usw

    die ich als dll in mein Programme einbinden möchte
    ich habe jetzt ein Bibliothek erzeugt
    dort dann über hinzufügen meine txt fils eingefügt
    <PRE>
    library de_DE;

    {%File 'Ressourcen\Controls.txt'}
    {%File 'Ressourcen\Einheiten.txt'}
    {%File 'Ressourcen\Hints.txt'}
    {%File 'Ressourcen\Messages.txt'}

    uses
    SysUtils,
    Classes,
    System.Reflection,
    System.Runtime.InteropServices;

    [assembly: AssemblyTitle('de_DE')]
    [assembly: AssemblyDescription('deutsch Deutschland')]
    [assembly: AssemblyConfiguration('')]
    [assembly: AssemblyCompany('')]
    [assembly: AssemblyProduct('')]
    [assembly: AssemblyCopyright('')]
    [assembly: AssemblyTrademark('')]
    [assembly: AssemblyCulture('de')]
    [assembly: AssemblyVersion('1.0.0.0')]
    [assembly: AssemblyDelaySign(false)]
    [assembly: AssemblyKeyFile('')]
    [assembly: AssemblyKeyName('')]
    </PRE>
    wie greife ich jetzt in mein Programm darauf zu

    Ich habe leider kein Ahnung

    alles schon gelesen nur nix gefunden

    gibt es womöglich ein buch
    "so in delphi gemacht und so wird in .net gemacht"
    Ein Bespiel wäre sehr hilfreich

  • #2
    Hallo,

    &gt;..in delphi.net umzusetzen..

    Das .NET Framework unterstützt gleich zwei Arten von Ressourcen. Zum einen die so genannten untypisierten Manifest-Ressourcen und zum anderen die typisierten Ressourcen. Mit Delphi.NET (8/2005) steht in der IDE nur der eingeschränkte Weg über die Manifest-Ressourcen zur Verfügung. Im Beispiel "Einbinden einer Grafikdatei" sieht das so aus:
    <br><br>
    1. Grafikdatei in das Projektverzeichnis kopieren<br>
    2. Grafikdatei über die <b>$R</b>-Direktive in die Projektdatei einfügen
    <pre>
    <b>program</b> AddBitmapResourceDemo;
    <br>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.dll'}</i></font>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.Data.dll'}</i></font>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.Drawing.dll'}</i></font>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.Windows.Forms.dll'}</i></font>
    <font color="#003399"><i>{%DelphiDotNetAssemblyCompiler '$(SystemRoot)\microsoft.net\framework\v1.1.4322\S ystem.XML.dll'}</i></font>
    <font color="#003399"><i>{$R 'AddBitmapResourceDemoFrm.TWinForm.resources' 'AddBitmapResourceDemoFrm.resx'}</i></font>
    <br>
    <b>uses</b>
    System.Reflection,
    System.Runtime.CompilerServices,
    System.Windows.Forms,
    AddBitmapResourceDemoFrm <b>in</b> <font color="#9933CC">'AddBitmapResourceDemoFrm.pas'</font> <font color="#003399"><i>{AddBitmapResourceDemoFrm.TWinF orm: System.Windows.Forms.Form}</i></font>;
    <br>
    <font color="#003399"><i>{$R *.res}</i></font>
    <font color="#003399"><i>{$R WinXP.bmp}</i></font>
    </pre>
    3. Ressourcen zur Laufzeit auslesen:
    <pre>
    <b>procedure</b> TWinForm.Button1_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>var</b>
    aBmpResStream : System.IO.Stream;
    aBmp : Bitmap;
    <b>begin</b>
    aBmpResStream := Assembly.GetExecutingAssembly.GetManifestResourceS tream(<font color="#9933CC">'WinXP.bmp'</font>);
    aBmp := Bitmap.Create(aBmpResStream);
    Picturebox1.Image := aBmp;
    <b>end</b>;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch

      Ich wolle eigentlich meine Resourcen
      in eine eigene DLL einbinden.
      mein Problem ist jetzt

      wie erzeuge ich eine Resource resx, binde die in einer DLL ein
      und wie rufe ich die dll (nicht im Programmverzeichnis) aus meinen Programm auf

      ich habe es mit D7 Pro immer so gamcht

      einen Text mit
      Controls RCDATA D:\Ressourcen\Controls.txt

      brcc32 1_ressourcen.rc
      PAUSE

      erzeugt(res)

      im Programm dann
      über
      <PRE>
      lib_h : THandle;
      res_s : TResourceStream;

      lib_h := LoadLibrary(sprache_path_name_s)
      res_s := TResourceStream.Create(lib_h, 'Controls', RT_RCDATA);
      </PRE>

      Wie sieht jetzt der Lösungsweg mit Delphi2005.net aus
      ihr bespiel bezieht sich auf eine bmp über eine Resource direkt ins Programm ein zubinden
      ich möchte es gerne in eigenen DLL's mache

      Comment


      • #4
        Hallo,

        &gt;Wie sieht jetzt der Lösungsweg mit Delphi2005.net ...

        das hängt davon ab, in welcher Form die Assembly-DLL vorliegt. Das folgende Beispiel (habe ich nur in C# vorrätig) lädt zur Laufzeit eine mit einem Strong Name signierte Assembly aus dem Global Assembly Cache:
        <pre>
        Assembly aAsm;
        AssemblyName aAsmName = <b>new</b> AssemblyName();
        aAsmName.Name = <font color="#9933CC">&quot;TestAssembly&quot;</font>;
        aAsmName.Version = <b>new</b> Version(1, 0, 0, 0);
        <font color="#003399"><i>// Public Key Token (siehe sn -T TestAssembly.dll = 6f 36 2b bd e8 0a a3 a7)</i></font>
        aAsmName.SetPublicKeyToken(<b>new</b> <b>Byte</b>[] {0x6F, 0x36, 0x2B, 0xBD, 0xE8, 0x0A, 0xA3, 0xA7});
        aAsmName.CultureInfo = <b>null</b>;
        <font color="#003399"><i>// Assembly-DLL laden</i></font>
        aAsm = Assembly.Load(aAsmName);

        </pre>
        Anstelle von <b>Assembly.GetExecutingAssembly</b> wird dann direkt der Assembly-Verweis verwendet, um die dort verpackten Ressourcen auszulesen

        Comment


        • #5
          >das hängt davon ab, in welcher Form die Assembly-DLL vorliegt

          weiter oben schreiben sie
          >Mit Delphi.NET (8/2005) steht in der IDE nur der eingeschränkte Weg über die Manifest-Ressourcen zur Verfügung

          ????
          das verstehe ich nicht ganz

          Comment


          • #6
            Hallo,

            &gt;..das verstehe ich nicht ganz?

            wenn nur mit Delphi 8/2005 gearbeitet wird, ist das auch verständlich. Erst beim direkten Vergleich mit VS.NET 2003 fällt auf, dass dort an dieser Stelle mehr Auswahl geboten wird. Delphi stellt das zur Verfügung, was auch mit den Kommandozeilen-Kompilern aus dem .NET Framework unterstützt wird. Am Beispiel von C# sieht das so aus:

            1. Beim Kompilieren wird über den Schalter <b>/resource</b> einen Verweis auf die anzuhängende Grafik definiert:
            <pre>
            csc /target:winexe /resourcehoto_csharp_home.gif ErsterTest.cs
            </pre>
            Schaut man sich nun das Ergebnis mit dem .NET FRAMEWORK IL DISASSEMBLER (<i>ildasm.exe</I>) an, so taucht dort ein <b>.mresource</B>-Eintrag für diese Grafikdatei auf. Dahinter verbirgt sich der Name der Ressource – der binäre Dateiinhalt ist bereits in der EXE der Anwendung enthalten:
            <pre>
            .mresource public photo_csharp_home.gif
            </pre>

            &gt;..das hängt davon ab, in welcher Form die Assembly-DLL vorliegt ..

            Prinzipiell gibt es verschiedene Wege, wie eine Assembly im System installiert und später wieder geladen werden kann:

            a) Globaler Assembly Cache (GAC): Über <b>Assembly.Load</b> wird die Assembly nach ihren Kennmerkmalen (Dateiname, Versionsnummer, Strong Name, CultureInfo) direkt aus dem GAC geladen, so dass keine Pfadangabe notwendig ist. Im GAC (siehe Verzeichnis <i>C:\WINDOWS\assembly</i>) können für den gleichen DLL-Namen verschiedene Versionen parallel installiert werden.

            b) Privates Verzeichnis (Anwendungs-Verzeichnis): Über <b>Assembly.LoadFrom</b> wird eine Assembly nur über den vollständigen Zugriffspfad (Festplattenverzeichnis + Dateiname) geladen

            Comment


            • #7
              Hallo Herr Kosch
              Jetzt sehe Licht
              >Prinzipiell gibt es verschiedene Wege, wie eine Assembly im System installiert und später wieder geladen werden kann:
              Punkt a und b erklären es.
              für mich hier Wichtig.
              Assembly.LoadFrom

              Danke
              Raimun

              Comment


              • #8
                Hallo Herr Kosch
                so habe ich jetzt gemacht

                eine Text Datei controls

                dort steht zB

                //HauptMenu

                HM_0=Datei

                HM_0_0=Beenden
                usw

                dann eine resource resX erstellt
                diese in eine DLL eingefügt

                {$R 'controls.resources' 'controls.resX'}

                und so in mein Programm aufgerufen
                <PRE>
                procedure HF.Button1_Click(sender: System.Object; e: System.EventArgs);
                var
                myDLL : Assembly;
                TheResourceManager: System.Resources.ResourceManager;
                str : String;
                begin

                myDLL := Assembly.LoadFrom('D:\sprachen\de_DE.dll');

                TheResourceManager := System.Resources.ResourceManager.Create('Controls' , myDLL);

                str := System.&String(TheResourceManager.GetObject('HM_0' ));

                self.Label1.Text := str;
                end;

                </PRE>

                Funktionieren tut es ;-)

                ist es auch richtig?
                nicht mehr mit free ?
                sie wollen mir doch jetzt nicht sagen das das so einfach geht. ;-

                Comment


                • #9
                  Hallo,

                  wenn es nur um das Auslesen eines Strings geht, würde der Aufruf der ResourceManager-Methode <b>GetString</b> sogar die explizite Typumwandlung unnötig machen.

                  &gt;...nicht mehr mit free ?

                  Das sind die Segnungen des Garbage Collectors, zumal der ResourceManager sein Elemente selbst verwaltet

                  Comment

                  Working...
                  X