c# - 关于构建操作的澄清

标签 c# wpf build embedded-resource

我有一个使用 Access DB 文件作为引用表的项目。这是要在工作中使用的,但我是在家里开发的。到目前为止,我只是在 VS2010 中运行调试器,然后将相关的类文件、exe 等从/bin 文件夹复制到闪存驱动器,并且工作正常。但是添加了数据库后,它在启动时突然崩溃。

我知道问题是数据库文件的文件位置。最初,数据库的构建操作被发送到内容。我已将其更改为“嵌入式资源”,据我了解,这意味着它将成为 exe 文件的一部分。

我的说法正确吗?如果不是,我需要选择什么选项才能使数据库成为 exe 或其他 dll 之一的编译部分?

最佳答案

如果数据库文件是嵌入的,您将无法访问它来添加/删除行等。 为什么将构建操作更改为 Embedded Resource ?最好将其作为 Content 放置,这样 db 是一个与 exe 不同的单独文件(但仍在同一目录中),然后构建 db 文件的路径(即使用 Application.StartupPath)。

无论如何,如果您想将其设置为嵌入式,您需要在运行时提取数据库并在使用之前将其存储在某个地方。

这是一个可以从嵌入资源中提取文件的方法(当然您需要更改文件名,或将其作为参数传递):

private void ExtractFromAssembly()
{
    string strPath = Application.LocalUserAppDataPath + "\\MyFile.db";
    if (File.Exists(strPath)) return; // already exist, don't overwrite
    Assembly assembly = Assembly.GetExecutingAssembly();
    //In the next line you should provide NameSpace.FileName.Extension that you have embedded
    var input = assembly.GetManifestResourceStream("MyFile.db");
    var output = File.Open(strPath, FileMode.CreateNew);
    CopyStream(input, output);
    input.Dispose();
    output.Dispose();
    System.Diagnostics.Process.Start(strPath);
}

private void CopyStream(Stream input, Stream output)
{
    byte[] buffer = new byte[32768];
    while (true)
    {
        int read = input.Read(buffer, 0, buffer.Length);
        if (read <= 0)
            return;
        output.Write(buffer, 0, read);
    }
}

该文件将被复制到本地应用程序路径的用户目录中。它将在应用程序第一次启动时完成,因为否则每次应用程序启动时db文件都会被覆盖(用exe中的clean db包覆盖)

关于c# - 关于构建操作的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10696521/

相关文章:

git - gradle提交到VCS所需的最少文件数是多少?

c# - 如何为多个动态文本框启用 Google 音译 (ASP.Net)

c# - Bentley-Ottmann 算法实现

c# - 实时系统的架构?

wpf - WPF 中的模态对话框

.net - Visual Studio 应用程序资源 : 'Icon and manifest' vs 'Resource file' issues

c# - 为什么 performanceCounter 的 NextValue 调用会改变线程关联掩码

c# - 无效的文件名。 TitleContainer.OpenStream 需要一个相对 URI

c# - Directshow录制/预览问题

javascript - webpack 的捆绑比应有的要多得多