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

.net 如何在C#应用程序中访问二进制资源,.net,resources,.net,Resources,我正在尝试将空的Access数据库(.mdb)存储为应用程序中的资源。然后,我想将其写入文件系统,并用表定义等填充它。我在Visual Studio 2005和我的C#应用程序中遇到的问题是无法访问存储在同一程序集中的资源(我认为默认情况下可以访问)。这是我的密码: byte[] abytResource; System.Reflection.Assembly objAssembly = System.Reflection.Assembly.GetExecutingAssembly(); obj

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

如何使我的资源可供我自己的应用程序访问?顺便说一句,我已经将它添加到项目中,并将其标记为“嵌入式资源”

谢谢

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

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

您还可以通过调用

string[] myResources = objAssembly.GetManifestResourceNames();
foreach(string reso in myResources) {
   Console.WriteLine(reso);
}
此外,请确保在编译操作时使用嵌入资源标记空.mdb文件


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

    /// <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();
        }
    }
//
///将嵌入式文件提取到本地文件系统。
/// 
///嵌入文件的资源名称。NameSpace.FileName.Extension
///提取的文件名
public void extractedembeddedfile(字符串resName,字符串文件名)
{
如果(File.Exists(fileName))File.Delete(fileName);
Assembly=Assembly.getExecutionGassembly();
使用(var输入=assembly.GetManifestResourceStream(resName))
使用(var output=File.Open(fileName,FileMode.CreateNew))
{
如果(input==null)抛出新的FileNotFoundException(resName+“:未找到嵌入式资源文件”);
var buffer=新字节[32768];
int-read;
而((read=input.read(buffer,0,buffer.Length))>0)
{
输出。写入(缓冲区,0,读取);
}
output.Flush();
}
}
这对于需要数据文件的C#单元测试非常有用,因为DLL通常在没有任何内容文件的情况下运行(它们可能在单元测试框架创建的临时文件夹中运行)

这有另一个文本文件(不是二进制文件)的代码段,但由于未能使用
using
语句,它可能存在内存泄漏