2017-12-03 5 views
1

Okay, so habe ich ein Problem, dass ich Probleme habe, eine Lösung zu finden. Es gibt viele Lösungen mit visuellen Studios Eigenschaften. Das Problem ist, dass ich keine Visual Studios verwende, ich benutze csc.exe, um meinen Code zu kompilieren.Arbeiten mit eingebetteten Ressourcen in externen DLL, ohne visuelle Studios

Hier ist, was ich bisher habe.


exe.cmd

dll.cmd

Resource.dll

Main.csx

Rsc.csx

a.png


Diese

ist der gesamte Code für die .cmd-Dateien und Dateien .csx

exe.cmd

@echo off 
csc.exe /target:winexe /reference:Resource.dll /out:Main.exe Main.csx 
pause 

dll.cmd

@echo off 
csc.exe /target:library /resource:a.png /out:Resource.dll Rsc.csx 
pause 

Rsc.csx

using System; 
using System.IO; 
using System.Drawing; 
using System.Reflection; 
using System.Windows.Forms; 

namespace EmIm 
{ 
    public static class Bck 
    { 
     public static Image GetBck() 
     { 
      Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png")); 
      Image rtn = bmp; 
      return rtn; 
     } 
    } 
} 

Haupt.csx

using System; 
using System.IO; 
using System.Drawing; 
using System.Reflection; 
using System.Windows.Forms; 

using EmIm; 

namespace prg 
{ 
    class class_m 
    { 
     public static void Main() 
     { 
      Form f1 = new Form(); 
      try 
      { 
       f1.BackgroundImage = Bck.GetBck(); 
      } 
      catch(Exception e) 
      { 
       MessageBox.Show(e.Message); 
      } 
      f1.ShowDialog(); 
     } 
    } 
} 

Als ich das laufen, ich ein messagebox erhalten, die Wert von ‚Null‘ anzeigt, ist nicht gültig für ‚Strom‘

Welche Schritte muss ich a.png in der Lage sein ergreifen müssen, um Zugang Mit Reflektion habe ich überprüft, ob a.png der korrekte Name in der Assembly ist. Jede Hilfe würde sehr geschätzt werden. Danke :)

+0

Ich denke, dass das Batch-Datei-Tag es ein wenig dehnt! – Compo

+0

Tsk, tsk. Die Methode GetBck() benötigt das Attribut [MethodImpl (MethodImplOptions.NoInlining)], damit Assembly.GetExecutingAssembly() ordnungsgemäß funktionieren kann. Es ist schwer zu erraten, warum irgendjemand sein Bein so absichtlich erstechen würde. –

Antwort

0

Vielen Dank an Hans Passant für die Bereitstellung der einfachen Lösung für dieses Problem. Ich hatte keine Ahnung, wo ich hinschauen sollte, um herauszufinden, wie ich dieses Problem lösen sollte, aber er fasste es in einem einzigen Kommentar zusammen.

nur eine Datei hatte für das Programm geändert werden, um

neuer Rsc.csx

using System; 
using System.IO; 
using System.Drawing; 
using System.Reflection; 
using System.Windows.Forms; 
using System.Runtime.CompilerServices; 

namespace EmIm 
{ 
    public static class Bck 
    { 
     [MethodImpl(MethodImplOptions.NoInlining)] 
     public static Image GetBck() 
     { 
      Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png")); 
      Image rtn = bmp; 
      return rtn; 
     } 
    } 
} 

wieder einmal Datei zu arbeiten, dank Hans Passanten für die schnelle Lösung für mein Problem, hoffentlich irgend andere Programmierer, die hartnäckig genug sind, um Visual Studios zu meiden, könnten darauf achten, eine Lösung zu finden, die ohne sie auskommt. Viel Spaß beim Programmieren :)

Verwandte Themen