我在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 上,我得到了这个:
答案 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