Путь данных приложения во время разработки и развертывания
У меня есть старое приложение Windows Forms.Net, которое в Windows XP было "развернуто", скопировав все файлы в папку приложения.
Теперь я планирую развернуть в более новую ОС Windows с помощью InstallShield или Advanced Installer и будет размещать DLL в папке установки приложения и в файлах содержимого в ProgramData и/или в AppData пользователя.
Таким образом, файлы содержимого будут находиться в одном месте во время отладки в Visual Studio 2010 (возможно, просто сохраните их там, где они есть сейчас, в папке bin/debug приложения) и другом месте при развертывании.
Как сделать доступ к этим файлам одинаковым образом, во время отладки Visual Studio, как во время развертывания?
Если бы у меня была глобальная строка, содержащая базовый путь для файлов содержимого, я мог бы получить доступ к файлам с контуром относительно этой строки. Но я не уверен, как создать строку, которая имеет правильный путь во время отладки, а затем другой путь во время развертывания.
Я знаю, что могу тестировать флаги Debug vs Release, но это не совсем то же самое. (переход на сборку релизов просто перемещает файлы на.. /bin/Release, а не на.. /bin/Debug, все еще не может быть развернут.)
Есть ли простой пример того, как это сделать?
Чтобы быть ясным, я не спрашиваю о деталях доступа к пути относительно базового каталога. Я спрашиваю, как отличать запуск и развертывание во время разработки.
Знание того, как обнаружить "я развернуто", - это минимальная помощь, которая мне нужна. Еще лучше будет мини-пример или ссылка на учебник, который показывает доступ к файлам контента в одном месте во время разработки и другое место при развертывании.
UPDATE
Каков наилучший способ в С# определить, запускает ли программатор программу через IDE или ее пользователя?
охватывает самый важный случай, поэтому я бы использовал его, если не было другого решения. Тем не менее, он работает неправильно, если разработчик дважды щелкает непосредственно на .exe в папке bin/debug проекта разработки. Поскольку они не работают в среде IDE (и мы не используем vshost.exe), но базовая папка такая же, как если бы они были.
UPDATE
При дальнейших размышлениях предлагаемый выше пакет Q & A не является совершенно одинаковым. Мне все равно, подключен ли отладчик (можно было прикрепить отладчик к установленной/развернутой версии, и это все равно будет развернутая версия, а не версия для разработки).
Я изначально думал, что где-то может быть какой-то стандартный флаг или настройки конфигурации, которые приложение может использовать для определения того, что оно установлено.
Как люди знают, где искать файлы своего контента, учитывая, что они не будут в одном месте во время разработки и установки? (Если вы не применяете подход "старой школы" к размещению файлов содержимого в папке установки приложения. Это то, что у меня было раньше, но теперь нужно делать по-другому.)
UPDATE
Наконец, было прозрение, что я не должен пытаться хранить файлы содержимого в папке bin/debug во время разработки - делал это только потому, что так было раньше. Не решили, переместить ли их все в место, где они будут размещены, или в другое место на машинах разработки.
Мне все еще интересно, как другие люди указывают расположение файлов содержимого во время разработки, но, возможно, это другой вопрос...
Ответы
Ответ 1
Я решил это, явно ищу файл в двух возможных местах. Затем кеширование пути каталога для будущего доступа к контенту. В моем случае местоположение "разработка" представляет собой папку "контент", расположенную рядом с папкой "bin".
' Language: Visual Basic (VB)
' ... this is inside a VB module ...
Public g_AppRelativePath As String = "CompanyName\AppName"
Private _contentPathRootWithSlash As String
Public Function ContentPath(relPath As String) As String
If _contentPathRootWithSlash Is Nothing Then
' --- first try to find "development" content ---
' Folder containing .exe.
Dim pathRoot As String = Application.StartupPath
Dim binIndex As Integer = pathRoot.LastIndexOf("bin", StringComparison.Ordinal)
If binIndex >= 0 Then
' "content" folder that has been prepared as a sibling of "bin".
pathRoot = pathRoot.Remove(binIndex) & "content"
End If
Dim pathRootWithSlash As String = pathRoot & "\"
If File.Exists(pathRootWithSlash & relPath) Then
_contentPathRootWithSlash = pathRootWithSlash
Else
' --- "development" content does not exist; look for "deployed" content. ---
'' Use this, if want files to be in User AppData\Roaming.
'pathRootWithSlash = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\"
' Use this, if want files to be shared by all users, in ProgramData.
pathRootWithSlash = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) & "\"
' g_AppRelativePath was previously set to "CompanyName\AppName", which matches logic in our installer.
pathRootWithSlash = pathRootWithSlash & g_AppRelativePath & "\"
If File.Exists(pathRootWithSlash & relPath) Then
_contentPathRootWithSlash = pathRootWithSlash
Else
' Failed to find.
MsgBox(String.Format("Can't find content file ""{0}""", relPath))
Return Nothing
End If
End If
End If
Return _contentPathRootWithSlash & relPath
End Function