3

我在 Visual Studio 中制作了一个简单的WPF应用程序。

它使用以下连接字符串访问自己目录中自己的数据库文件:

System.Environment.CurrentDirectory + @"\Data\" + databaseFileName;

我点击了发布,基本上接受了所有默认设置(CD/DVD 发布,没有在线更新)。

我将安装文件夹复制到另一台计算机。

在新计算机上,我双击setup.exe

它安装得很好,在开始菜单中,但是当它运行时,它得到这个错误

替代文字 http://www.deviantsart.com/upload/11jfc2c.png

我已在项目/属性/安全中授予应用程序所有权限:

替代文字 http://www.deviantsart.com/upload/si6urj.png

我必须更改什么,以便使用 ClickOnce 部署的此应用程序可以在 .exe 文件下方的相对目录中找到其数据库,即“Data/MainData.mdf”?

附录以下答案中的修复适用于 Windows 7,但在Windows XP上,我得到了这个:

替代文字 http://www.deviantsart.com/upload/1pds19l.png

4

1 回答 1

4

首先,您将其部署为数据,您的连接字符串显示了这一点。DataDirectory 转换为 ClickOnce 缓存下的 Data 文件夹,如果您将文件标记为数据,则 ClickOnce 将文件放置在该文件夹中。

如果您不想在此处部署它,但希望它与 [exe] 相关,请进入“发布”选项卡中的“应用程序文件”对话框,并将其从包含(数据)更改为仅包含。然后它将把它放在相对于 exe 位置的位置。(IE如果你在项目的一个文件夹里有,它会放在部署的exe下的对应文件夹中)。不要忘记更改您的连接字符串。

如果您将其部署在该位置,则在发布更新时它将丢失。(只是让你知道)。以下是关于您可以将数据放在何处以避免此问题的想法:

如何保护您的数据免受 ClickOnce 更新的影响

您需要动态创建连接字符串 Path.Combine(System.Windows.Forms.Application.StartupPath, "Data\mydatabase.mdf"); 或者它将从当前程序集的默认路径开始(在您的情况下为 .NET)。

- 添加 -

啊,WPF,对不起,错过了。您基本上需要获取运行 exe 的文件夹。看看这是否有帮助:

在 System.Reflection 命名空间中:

Assembly assemblyInfo = Assembly.GetExecutingAssembly();
if (assemblyInfo != null)
{
    //try Path.GetDirectoryName(assemblyInfo.Location)
    //if that doesn't work, try assemblyInfo.CodeBase 
}

(在 VSTO 应用程序中,由于 dll 的阴影,您必须使用 CodeBase。我认为 Location 将适用于常规应用程序。)

罗宾点网

于 2010-01-16T00:46:59.860 回答