代码之家  ›  专栏  ›  技术社区  ›  Karim

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

  •  10
  • Karim  · 技术社区  · 17 年前

    我正试图将一个空的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();
    

    谢谢!

    3 回复  |  直到 17 年前
        1
  •  16
  •   David M    17 年前

    您需要在“empty.mdb”前加上程序集的默认命名空间。类似于:

    objStream = objAssembly.GetManifestResourceStream("My.Namespace.empty.mdb");
    
        2
  •  9
  •   Jhonny D. Cano -Leftware-    17 年前

    您还可以通过调用以下命令来检查资源的名称

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

    此外,请确保在编译操作时,您的空.mdb文件已标记为嵌入式资源

    alt text http://img520.imageshack.us/img520/6649/sinttuloo.png

        3
  •  1
  •   Tony O'Hagan    11 年前

    这将提取一个二进制嵌入式资源文件。..

        /// <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 声明。

    推荐文章