如何使用访问本地MDF数据库文件的ClickOnce部署WPF应用程序?

时间:2010-01-16 00:02:12

标签: visual-studio deployment clickonce publish

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

使用此连接字符串访问其自己的拥有数据库文件:

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

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

我将设置文件夹复制到另一台计算机。

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

它安装得很好,位于开始菜单中,但是当它运行时,会出现错误

alt text http://www.deviantsart.com/upload/11jfc2c.png

我已经在项目/属性/安全性中为应用程序提供了所有权限

alt text http://www.deviantsart.com/upload/si6urj.png

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

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

alt text http://www.deviantsart.com/upload/1pds19l.png

1 个答案:

答案 0 :(得分:4)

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

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

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

How to keep your data safe from ClickOnce updates

您需要动态创建连接字符串,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适用于常规应用程序。)

RobinDotNet