Ссылка на встроенный ресурс из скомпилированного Exe-файла Codedom

#c# #.net-assembly #system.reflection #codedom #csharpcodeprovider

Вопрос:

Я использую компилятор CodeDom и Microsoft.CSharp, я пытаюсь встроить ресурс и вызвать его. Причина, по которой я не пытаюсь вызвать свойства, заключается в том, что я всегда получаю сообщение об ошибке Properties does not exist in the current context . Поэтому я хочу знать Parameters.EmbeddedResources.Add("C:/Users/User1/Music/sample.mp3"); , действительно ли это полезно или мне следует делать это по-другому. Это то, что у меня есть сейчас в исходном коде компилятора:

 Extract("TestCompiler", "C:/Users/User1/Downloads", "", "Music.mp3");  private static void Extract(string NameSpace, string OutputDir, string InternalPath, string ResourceName){  Assembly assembly = Assembly.GetCallingAssembly();  using (Stream s = assembly.GetManifestResourceStream(NameSpace   "."   (InternalPath == "" ? "" : InternalPath   ".")   ResourceName))  using (BinaryReader r = new BinaryReader(s))  using (FileStream fs = new FileStream(OutputDir   "\"   ResourceName, FileMode.OpenOrCreate))  using (BinaryWriter w = new BinaryWriter(fs))  w.Write(r.ReadBytes((int)s.Length));  }  

Когда я делаю это и запускаю скомпилированный exe-файл, я получаю исключение/ошибку:

 Unhandled Exception: System.ArgumentNullException: Value cannot be null. Parameter name: input  at System.IO.BinaryReader..ctor(Stream input, Encoding encoding, Boolean leaveOpen)  at TestCompiler.Program.Extract(String NameSpace, String OutputDir, String InternalPath, String ResourceName)  at TestCompiler.Program.Main(String[] args)  

Я тоже пытался это сделать Extract("TestCompiler", "C:/Users/User1/Downloads", "Resources", "Music.mp3"); , но получаю ту же ошибку.

Возможен ли вызов встроенного ресурса или мне следует отказаться? Я занимаюсь этим уже 3 дня.

Ответ №1:

Чтобы ответить на свой собственный вопрос, я должен был получить все ресурсы, сделав это:

 string[] Resources = Assembly.GetExecutingAssembly().GetManifestResourceNames();  

и чтобы ссылаться на них и извлекать их, я сделал это:

 foreach(string Resource in Resources)  WriteResources(Resources[Resource], "C:\Test\example.mp3");  public static void WriteResources(string Name, string Output){  using(var Resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(Name))  using(var File = new FileStream(Output, FileMode.Create, FileAccess.Write))  Resource.CopyTo(File); }  

К счастью, я смог закончить свой проект через несколько дней.