0

我以前在我的一个程序中嵌入了文件并取得了圆满成功,但我现在已将代码行转移到第二个程序中,令我失望的是,我无法让它为我的一生工作。

提取代码如下:

private static void Extract(string nameSpace, string outDirectory, string internalFilePath, string resourceName)
    {
        Assembly assembly = Assembly.GetCallingAssembly();

        using (Stream s = assembly.GetManifestResourceStream(nameSpace + "." + (internalFilePath == "" ? "" : internalFilePath + ".") + resourceName))
        using (BinaryReader r = new BinaryReader(s))
        using (FileStream fs = new FileStream(outDirectory + "\\" + resourceName, FileMode.OpenOrCreate))
        using (BinaryWriter w = new BinaryWriter(fs))
            w.Write(r.ReadBytes((int)s.Length));
    }

要提取我想要位于名为 NewFolder1 的文件夹中的程序,我正在输入代码:

Type myType = typeof(NewProgram);
            var n = myType.Namespace.ToString();
            String TempFileLoc = System.Environment.GetEnvironmentVariable("TEMP");
            Extract(n, TempFileLoc, "NewFolder1", "Extract1.exe");

我可以毫无错误地编译程序,但是一旦程序到达要提取的行:

Extract(n, TempFileLoc, "NewFolder1", "Extract1.exe");

程序崩溃,我得到一个错误:“值不能为空”

是的,我包括了 System.IO 和 System.Reflection

4

1 回答 1

1

有几件事。

首先,您可能应该添加一些错误检查,以便找出问题所在。而不是:

using (Stream s = assembly.GetManifestResourceStream(nameSpace + "." +
   (internalFilePath== "" ? "" : internalFilePath + ".") + resourceName))

写:

string name = nameSpace + "." +
   (internalFilePath== "" ? "" : internalFilePath + ".") + resourceName;
Stream s = assembly.GetManifestResourceStream(name);
if (s == null)
{
    throw new ApplicationException(); // or whatever
}

using (s)
{
    // other stuff here
}

打开FileStream.

如果您进行了这些更改,您可以在调试器中单步执行或编写代码来输出跟踪信息,从而准确地告诉您错误发生的位置。

其次,这里不需要BinaryReaderor BinaryWriter。你可以写:

s.CopyTo(fs);

这将复制整个流内容。

于 2013-08-28T18:27:30.463 回答