我正在尝试将一个空的Access数据库(.mdb)存储为我的应用程序中的资源。然后我想把它写出文件系统并用表定义等填充它。我在Visual Studio 2005和我的C#应用程序中遇到的问题是无法访问存储在同一程序集中的资源(我本来以为默认可以访问)。这是我的代码:
byte[] abytResource;
System.Reflection.Assembly objAssembly = System.Reflection.Assembly.GetExecutingAssembly();
objStream = objAssembly.GetManifestResourceStream("empty.mdb");
abytResource = new Byte[objStream.Length];
objStream.Read(abytResource, 0, (int)objStream.Length);
objFileStream = new FileStream(newDatabasePathWithName, FileMode.Create);
objFileStream.Write(abytResource, 0, (int)objStream.Length);
objFileStream.Close();
GetManifestResourceStream返回NULL,并且根据文档说明,因为资源必须是私有的(因为即使它不存在,也会返回非NULL值)。所以我的问题是:
如何让我的资源可以访问自己的应用程序?我已将它添加到项目中并顺便将其标记为“嵌入式资源”。
谢谢!
答案 0 :(得分:16)
您需要在“empty.mdb”前加上程序集的默认命名空间。类似的东西:
objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb");
答案 1 :(得分:9)
您还可以通过调用
来检查资源的名称string[] myResources = objAssembly.GetManifestResourceNames();
foreach(string reso in myResources) {
Console.WriteLine(reso);
}
此外,请确保您的empty.mdb文件在编译操作
上标有嵌入式资源alt text http://img520.imageshack.us/img520/6649/sinttuloo.png
答案 2 :(得分:1)
这将提取二进制嵌入式资源文件......
/// <summary>
/// Extracts an embedded file to local file system.
/// </summary>
/// <param name="resName">Resource name of embedded file. NameSpace.FileName.Extension</param>
/// <param name="fileName">Extracted file name</param>
public void ExtractEmbeddedFile(string resName, string fileName)
{
if (File.Exists(fileName)) File.Delete(fileName);
Assembly assembly = Assembly.GetExecutingAssembly();
using (var input = assembly.GetManifestResourceStream(resName))
using (var output = File.Open(fileName, FileMode.CreateNew))
{
if (input == null) throw new FileNotFoundException(resName + ": Embedded resoure file not found");
var buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, read);
}
output.Flush();
}
}
对于需要数据文件的C#单元测试非常有用,其中DLL通常在没有任何内容文件的情况下运行(它们可以在单元测试框架创建的临时文件夹中运行)。
这有另一个文本文件(不是二进制文件)的代码片段,尽管它可能有内存泄漏,因为它无法使用using
语句。