Получение строки из исходного кода IronPython с помощью C # - PullRequest
1 голос
/ 11 октября 2010

Книга 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 ()" и почему я получаю ошибку?
  • Мой новый код совпадает со старым кодом с точки зрения результата выполнения?

1 Ответ

3 голосов
/ 11 октября 2010
  • Для исходного кода, что за функция "assembly.GetManifestResourceStream ()" и почему я получаю ошибку? : она ищет встроенный ресурс скомпилирован в ваше приложение с указанным именем. Скорее всего, вы не добавляете ресурс с таким именем.

  • Мой новый код совпадает со старым кодом с точки зрения результата выполнения? : Нет. Ваш файл считывается с диска с заданным именем в том же каталоге, что и сборка. Оригинал читает ресурс из в сборке.

...