2013-05-24 9 views
16

Sto incorporare un file binario con i/linkres: argomento compilatore, ma quando provo a caricarlo con:carico Cant risorsa incorporata con GetManifestResourceStream()

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly(); 
string[] names = myAssembly.GetManifestResourceNames(); // it is really there by its name "shader.tkb" 
Stream myStream = myAssembly.GetManifestResourceStream(names[0]); 

questo porta a una

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'shader.tkb' or one of its dependencies. The system cannot find the file specified. ---> System.IO.FileNotFoundException: The system cannot find the file specified. (Exception from HRESULT: 0x80070002) 
--- End of inner exception stack trace --- 
at System.Reflection.RuntimeAssembly.GetResource(RuntimeAssembly assembly, String resourceName, UInt64& length, StackCrawlMarkHandle stackMark, Boolean skipSecurityCheck) 
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name, StackCrawlMark& stackMark, Boolean skipSecurityCheck) 
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name) 

Qual è il problema qui?

risposta

33

1 - L'azione di creazione del file deve essere Risorsa incorporata.
2 - Non è possibile specificare solo il nome della risorsa. È necessario specificare l'intero nome di montaggio prima il nome della risorsa

Assembly assembly = this.GetType().Assembly; 
assembly.GetManifestResourceStream(
    assembly.GetName().Name + "." + "SubFolderNameIfAny" + ".shader.tkb"); 
+0

annuncio 1) come lo si specifica sulla riga di comando? non ho studio visivo. – clamp

+0

hai dato il campione C#, non sono sicuro di cosa stai provando a fare. –

+5

GetManifestResourceNames() getta luce –

2

Progetto namespace può avere bisogno di essere prese in considerazione:

Che cosa ha funzionato per me era:

System.Reflection.Assembly assem = this.GetType().Assembly;   
using(Stream stream = assem.GetManifestResourceStream("Project_A.FolderName.test.txt")) 

Dove " Project_A "erano i miei progetti namespace.
Dove "FolderName" è una cartella nei miei progetti Solution Explorer.
Dove "test.txt" è una risorsa incorporata nella cartella "FolderName".

Se ho usato:

assem.GetName().Name 

avrei ricevuto "Progetto A" invece di "Project_A"?!?!?!?

1

È possibile utilizzare GetManifestResourceNames() sull'oggetto Assembly per ottenere l'intero elenco di file (e il loro nome).

Non so perché ma sul mio progetto non dovrei includere il nome della sottocartella. Solo il basename dell'assembly con il nome del file.

1

This link ti aiuterà a capire come utilizzare le risorse incorporate. La soluzione fornita da Aseem funziona solo se il nome dell'Assembly è lo stesso dello spazio dei nomi Default del progetto, come menzionato nella scheda 'Applicazione' delle proprietà del progetto.

Cosa deve essere fatto (anche se il nome Assemblea non è lo stesso di spazio dei nomi predefinito del progetto) è:

using System.IO; 
using System.Reflection; 

Assembly myAssembly = Assembly.GetExecutingAssembly(); 
Stream myStream = assembly.GetManifestResourceStream(fullResourceName); 

dove fullResourceName è il nome completo della risorsa incorporata si desidera accedere.

Se la risorsa (in questo caso shader.tkb) si trova nella cartella principale del progetto, quindi fullResourceName = "Default.Namespace.Of.Project.shader.tkb". Se la risorsa è presente all'interno di una cartella denominata Resources situata nella cartella del progetto, quindi fullResourceName = "Default.Namespace.Of.Project.Resources.shader.tkb".

Problemi correlati