#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); }
К счастью, я смог закончить свой проект через несколько дней.