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

10

我正在尝试将一个空的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个回答

17

你需要使用程序集的默认命名空间来为 "empty.mdb" 添加前缀。例如:

objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb");

11

您还可以通过调用

invoking

来检查您资源的名称。

string[] myResources = objAssembly.GetManifestResourceNames();
foreach(string reso in myResources) {
   Console.WriteLine(reso);
}

此外,请确保您的 empty.mdb 文件在编译操作中标记为嵌入资源(Embedded Resource)

alt 文本 http://img520.imageshack.us/img520/6649/sinttuloo.png


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接