使用C#从IronPython源代码获取字符串

时间:2010-10-11 17:34:29

标签: c# .net ironpython

本书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 个答案:

答案 0 :(得分:3)

  • 对于原始代码,什么是“assembly.GetManifestResourceStream()”函数,为什么我会收到错误?:它查找编译成embedded resource的函数您的应用程序具有给定名称。最有可能的是,您没有添加具有该名称的资源。

  • 我的新代码在执行结果方面是否与旧代码相同?:否。您从具有给定名称的磁盘读取文件,与程序集在同一目录中。原始文件从程序集中读取资源。