如何访问C#应用程序中的二进制资源

时间:2009-04-07 14:07:52

标签: .net resources

我正在尝试将一个空的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值)。所以我的问题是:

如何让我的资源可以访问自己的应用程序?我已将它添加到项目中并顺便将其标记为“嵌入式资源”。

谢谢!

3 个答案:

答案 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语句。