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