Как развернуть приложение WPF с ClickOnce, которое обращается к локальному файлу базы данных MDF? - PullRequest
3 голосов
/ 16 января 2010

Я сделал простое WPF приложение в Visual Studio.

Он получает доступ к своему собственному файлу базы данных в своем собственном каталоге с помощью строки подключения:

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

1 Ответ

4 голосов
/ 16 января 2010

Во-первых, вы развертываете его как данные, и ваша строка подключения показывает это. DataDirectory преобразуется в папку Data в кэше ClickOnce, и именно здесь ClickOnce помещает файл, если он помечен как данные.

Если вы не хотите, чтобы он здесь развертывался, но хотите, чтобы он относился к [exe], перейдите в диалог «Файлы приложения» на вкладке «Публикация» и измените его с «Включить (данные)» на «Включить». Затем он поместит его в местоположение относительно расположения exe. (Т.е. если у вас есть это в папке в вашем проекте, он поместит его в соответствующую папку в развернутом exe). Не забудьте изменить строку подключения.

Если вы развернете его в этом месте, он будет потерян при выпуске обновлений. (Просто чтобы ты знал). Вот идея о том, где еще вы можете разместить свои данные, чтобы избежать этой проблемы:

Как защитить ваши данные от обновлений ClickOnce

Вам необходимо создать строку подключения динамически, Path.Combine (System.Windows.Forms.Application.StartupPath, "Data \ mydatabase.mdf"); или он будет начинаться с пути по умолчанию для текущей сборки (в вашем случае - .NET).

- дополнение -

Argh, 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 вы должны использовать CodeBase из-за затенения dll. Я думаю, что Location будет работать для обычного приложения.)

RobinDotNet

...