Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung Visual Studio

Mitglied: mayho33

mayho33 (Level 2) - Jetzt verbinden

18.01.2015, aktualisiert 19.01.2015, 1032 Aufrufe, 4 Kommentare

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:

01.
public string Extract(string fullPathPerNamespace, string destinationFullPath) 
02.
03.
            string toReturn = String.Empty; 
04.
            if (Directory.Exists(Path.GetDirectoryName(destinationFullPath))) 
05.
06.
                try 
07.
08.
                    Stream stream = GetType().Assembly.GetManifestResourceStream(fullPathPerNamespace); 
09.
                    byte[] bytes = new byte[(int)stream.Length]; 
10.
                    stream.Read(bytes, 0, bytes.Length); 
11.
                    File.WriteAllBytes(destinationFullPath, bytes); 
12.
                    toReturn = destinationFullPath; 
13.
14.
                catch (Exception e) 
15.
16.
                    MessageBox.Show(e.GetBaseException().Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
17.
18.
19.
            return toReturn; 
20.
        }
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!

Mitglied: 114757
LÖSUNG 18.01.2015, aktualisiert 19.01.2015
Erst das andere Assembly laden und darauf die Methode .GetManifestResourceStream anwenden.
http://www.vb-helper.com/howto_net_reflection_load_resources.html

Gruß jodel32
Bitte warten ..
Mitglied: alaim89
LÖSUNG 18.01.2015, aktualisiert 19.01.2015
Ich glaube wenn du dem hier folgst
Bsp:
01.
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
Bitte warten ..
Mitglied: mayho33
18.01.2015, aktualisiert 19.01.2015
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:

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


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:
01.
public bool Extract(Assembly assembly, string embeddedResourceName, string destinationFullPath) 
02.
03.
            bool toReturn = false; 
04.
            if (Directory.Exists(Path.GetDirectoryName(destinationFullPath))) 
05.
06.
                Assembly newAssemblyInstance = Assembly.Load(assembly.GetName().Name); 
07.
                var nameSpace = String.Format("{0}.{1}", newAssemblyInstance.GetTypes().FirstOrDefault(t => t.Namespace.Length > 0).Namespace, embeddedResourceName); 
08.
                try 
09.
10.
                    using (Stream stream = assembly.GetManifestResourceStream(nameSpace)) 
11.
                    using (BinaryReader r = new BinaryReader(stream)) 
12.
                    using (FileStream fs = new FileStream(destinationFullPath, FileMode.CreateNew)) 
13.
                    using (BinaryWriter w = new BinaryWriter(fs)) 
14.
                        w.Write(r.ReadBytes((int)stream.Length)); 
15.
                    toReturn = true; 
16.
17.
                catch (Exception e) 
18.
19.
                    MessageBox.Show(e.GetBaseException().Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
20.
21.
 
22.
23.
            return toReturn; 
24.
        }
Danke für den Tipp mit Assembly.Load().

Grüße!

Mayho
Bitte warten ..
Mitglied: alaim89
20.01.2015 um 19:44 Uhr
Seher Nice,

freut mich das es geklappt hat !


Gruß


alaim89
Bitte warten ..
Ähnliche Inhalte
Datenbanken
gelöst SQL Abfrage mit Visual Studio (5)

Frage von specialuser zum Thema Datenbanken ...

Visual Studio
Visual Studio 2017 - Offline-Installationsdateien updaten (1)

Frage von Highend01 zum Thema Visual Studio ...

Neue Wissensbeiträge
Heiß diskutierte Inhalte
Windows Systemdateien
NTFS und die Defragmentierung (26)

Frage von WinLiCLI zum Thema Windows Systemdateien ...

LAN, WAN, Wireless
Zwei Subnetze mit je eigenem Router und Internetzugang verbinden (18)

Frage von hannsgmaulwurf zum Thema LAN, WAN, Wireless ...

Windows Server
WIndows Server 2016 core auf dem Intel NUC NUC5i5RYK i5 5250U (17)

Frage von IxxZett zum Thema Windows Server ...