mayho33
Goto Top

C Sharp (Visual Studio 2013)- embedded resourse aus anderem Assambly entpacken

Hallo @ All!

Ich hänge wider mal an einem Problem fest und hoffe auf eure KnowHow.

Wenn ich eine embedded resource entpacken will nutze ich immer diese Function:

public string Extract(string fullPathPerNamespace, string destinationFullPath)
        {
            string toReturn = String.Empty;
            if (Directory.Exists(Path.GetDirectoryName(destinationFullPath)))
            {
                try
                {
                    Stream stream = GetType().Assembly.GetManifestResourceStream(fullPathPerNamespace);
                    byte bytes = new byte[(int)stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    File.WriteAllBytes(destinationFullPath, bytes);
                    toReturn = destinationFullPath;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.GetBaseException().Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);  
                }
            }
            return toReturn;
        }

Das funktioniert super im eigenen Assambly. Aus Gründen der Wiederverwendbarkeit, Bequemlichkeit, usw. versuche ich gerade diese Function in eine DLL zu verpacken. Da funktionierts dann logischerweise nicht mehr und ich habe keine Ahnung wie ich das realisieren könnte, weil offensichtlich noch was fehlt.


Sachen wie...:
http://msdn.microsoft.com/de-at/library/aa984408%28v=vs.71%29.aspx
http://stackoverflow.com/questions/11377790/find-all-embedded-resources ...
...haben nicht das Ergebnis, das ich brauche.

Google gibt zwar viel her, bis jetzt aber leider nur Nieten (oder ich habe es falsch angewendet). Hat von euch jemand eine Idee?

Danke!

Grüße Mayho!

Content-ID: 260318

Url: https://administrator.de/contentid/260318

Ausgedruckt am: 26.11.2024 um 02:11 Uhr

114757
Lösung 114757 18.01.2015, aktualisiert am 19.01.2015 um 17:07:53 Uhr
Goto Top
Erst das andere Assembly laden und darauf die Methode .GetManifestResourceStream anwenden.
http://www.vb-helper.com/howto_net_reflection_load_resources.html

Gruß jodel32
alaim89
Lösung alaim89 18.01.2015, aktualisiert am 19.01.2015 um 17:07:57 Uhr
Goto Top
Ich glaube wenn du dem hier folgst
Bsp:
using (var target = assembly.GetManifestResourceStream("MySql.Data.dll"))  
bist du auf der sicheren Seite. Und wie schon @114757 sagt, zuvor das Assembly Laden.


Gruß alaim89
mayho33
mayho33 18.01.2015, aktualisiert am 19.01.2015 um 17:07:40 Uhr
Goto Top
Hi

Sorry, aber das funktioniert nicht. Der Stream ist immer null. Eventuell muss ich den Aufbau etwas genauer erklären:

Ich habe ein Forms-Project (meine exe) und ein DLL-Project. Beide sind nicht Teil ein und der selben Solution oder sonst irgendwie zusammenhängend und haben auch nicht den gleichen Namespace.
Bisher habe ich obige Function immer in meine Projekte eingebaut, wenn ich sie gebraucht habe. Wegen der Bequemlichkeit usw. will ich diese Function nun in einer DLL.
Wenn ich oben genannte Function in meinem Forms.Project ausführen funktioniert's wie es soll. die gewünschten embedded Resources werden wie gewünscht ins FileSystem kopiert.

Baue ich die gleiche Function nun in die DLL ein und referenziere im Forms-Project auf die DLL (unter Verweise) functioniert's nicht mehr.

Function habe ich nun derart angepasst dass ich das Assembly meiner EXE gleich als Parameter übergebe:

public string Extract(Assembly assembly, string embeddedResourceFullPath, string destinationFullPath)
{
    // führt zum gleichen Ergebnis:
    Assembly refAssembly = Assembly.LoadFrom(assembly.CodeBase); // ist geladen aber....
    Assembly refAssembly = Assembly.Load(assembly.GetName().Name); // geht zwar aber....
    Stream stream = refAssembly .GetType().Assembly.GetManifestResourceStream(embeddedResourceName); //  ....stream ist null
    //....
}



Hast du ein Beispiel?


EDIT:

Habe den Fehler gefunden. Meine embedded Resource war nicht als "embedded" markiert. Ein paar kleine Änderungen im Code und schon macht die Methode was sie soll.

hier die Methode:
public bool Extract(Assembly assembly, string embeddedResourceName, string destinationFullPath)
        {
            bool toReturn = false;
            if (Directory.Exists(Path.GetDirectoryName(destinationFullPath)))
            {
                Assembly newAssemblyInstance = Assembly.Load(assembly.GetName().Name);
                var nameSpace = String.Format("{0}.{1}", newAssemblyInstance.GetTypes().FirstOrDefault(t => t.Namespace.Length > 0).Namespace, embeddedResourceName);  
                try
                {
                    using (Stream stream = assembly.GetManifestResourceStream(nameSpace))
                    using (BinaryReader r = new BinaryReader(stream))
                    using (FileStream fs = new FileStream(destinationFullPath, FileMode.CreateNew))
                    using (BinaryWriter w = new BinaryWriter(fs))
                        w.Write(r.ReadBytes((int)stream.Length));
                    toReturn = true;
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.GetBaseException().Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);  
                }

            }
            return toReturn;
        }

Danke für den Tipp mit Assembly.Load().

Grüße!

Mayho
alaim89
alaim89 20.01.2015 um 19:44:11 Uhr
Goto Top
Seher Nice,

freut mich das es geklappt hat !


Gruß


alaim89