Книга IronPython In Action содержит следующий код для чтения сценария Python в строку.(Глава 15.2)
static string GetSourceCode(string pythonFileName)
{
Assembly assembly = Assembly.GetExecutingAssembly();
Stream stream = assembly.GetManifestResourceStream(pythonFileName);
StreamReader textStreamReader = new StreamReader(stream);
return textStreamReader.ReadToEnd();
}
Он читает BasicEmbedding.source_code.py в строку.Я просто скопировал код, но получил следующую ошибку.(Работает только из примера кода, все в порядке)
Unhandled Exception: System.ArgumentNullException: Argument cannot be null.
Parameter name: stream
at System.IO.StreamReader.Initialize (System.IO.Stream stream, System.Text.Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) [0x00000] in :0
at System.IO.StreamReader..ctor (System.IO.Stream stream, System.Text.Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize) [0x00000] in :0
at System.IO.StreamReader..ctor (System.IO.Stream stream) [0x00000] in :0
at (wrapper remoting-invoke-with-check) System.IO.StreamReader:.ctor (System.IO.Stream)
at BasicEmbedding.Program.GetSourceCode (System.String pythonFileName) [0x00000] in :0
at BasicEmbedding.Program.Main () [0x00000] in :0
Я думаю, что я могу реализовать ту же функцию, как показано ниже, которая работает хорошо.
static string GetSourceCode(string pythonFileName)
{
Assembly assembly = Assembly.GetExecutingAssembly();
string path = assembly.Location;
string rootDir = Directory.GetParent(path).FullName;
string pythonScript = Path.Combine(rootDir, pythonFileName);
StreamReader textStreamReader = File.OpenText(pythonScript);
return textStreamReader.ReadToEnd();
}
Вопрос
- Для оригинального кода, что за функция "assembly.GetManifestResourceStream ()" и почему я получаю ошибку?
- Мой новый код совпадает со старым кодом с точки зрения результата выполнения?