我之前在我的程序中嵌入了文件并取得了圆满成功,但我现在已将代码行转移到第二个程序,令我失望的是,我无法让它在我的生活中工作。
提取的代码是:
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
答案 0 :(得分: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
时,您应该做同样的事情。
如果进行了这些更改,您可以单步执行调试器或编写代码以输出跟踪信息,告诉您完全发生错误的位置。
其次,此处不需要BinaryReader
或BinaryWriter
。你可以写:
s.CopyTo(fs);
将复制整个流内容。