2015-05-28 5 views
0

У меня есть старое приложение Windows Forms .Net, которое в Windows XP было «развернуто», скопировав все файлы в папку приложения.путь данных приложения во время разработки и развертывания

Теперь я планирую развернуть на более новые ОС Windows с помощью InstallShield или Advanced Installer и будет размещать dll в папке установки приложения и в файлах содержимого в ProgramData и/или в AppData пользователя.

Таким образом, файлы содержимого будут находиться в одном месте во время отладки в Visual Studio 2010 (возможно, просто сохраните их там, где они есть сейчас, в папке bin/debug приложения) и другом месте при развертывании.

Как сделать доступ к этим файлам одинаковым образом, во время отладки Visual Studio, как во время развертывания?

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

Я знаю, что могу тестировать Debug vs Release flags, но это не совсем то же самое. (переход на выпускную сборку просто перемещает файлы на ../bin/Release, а не на ../bin/Debug; возможно, он еще не развернут.)

Есть ли простой пример того, как это сделать?

Чтобы быть ясным, я не спрашиваю о деталях доступа к пути относительно базового каталога. Я спрашиваю, как отличать запуск и развертывание во время разработки.

Знание того, как обнаружить «Я развернуто», - это минимальная помощь, которая мне нужна. Еще лучше будет мини-пример или ссылка на учебник, который показывает доступ к файлам контента в одном месте во время разработки и другое место при развертывании.


UPDATE

What is the best way in c# to determine whether the programmer is running the program via IDE or it's user? охватывает наиболее важный случай, поэтому я хотел бы использовать его, если бы не было никакого другого решения. Тем не менее, он работает неправильно, если разработчик дважды щелкает непосредственно на .exe в папке bin/debug проекта разработки. Поскольку они не работают в среде IDE (и мы не используем vshost.exe), но базовая папка такая же, как если бы они были.

UPDATE

При дальнейшем размышлении, что StackOverflow Q & Предложенное выше вовсе не одно и то же. Мне все равно, подключен ли отладчик (можно было прикрепить отладчик к установленной/развернутой версии, и он все равно будет развернутой версией, а не версией разработки).

Я изначально думал, что может быть какой-то стандартный флаг или настройка конфигурации где-то, что приложение может использовать для определения того, что оно установлено.

Как люди знают, где искать файлы своего контента, учитывая, что они не будут в одном месте во время разработки или установки? (Если вы не применяете подход «старой школы» к размещению файлов содержимого в папке установки приложения. Это то, что у меня было раньше, но теперь нужно делать по-другому.)


UPDATE

Наконец было прозрение, что я не должен пытаться сохранить файлы содержимого в папке bin/отладки в процессе разработки - только делал, что, потому что это, как это было раньше. Не решили, переместить ли их все в место, где они будут размещены, или в другое место на машинах разработки.

Я до сих пор интересно, как другие люди, указать расположение файлов содержимого во время разработки, но, возможно, это уже другой вопрос ...

+0

возможно дубликат [Что это лучший способ в C#, чтобы определить, является ли программист запустить программу через IDE или его пользователя?] (Http://stackoverflow.com/questions/2004629/what-is- наилучшим образом-в-c-sharp-to-define-is-the-programmer-is-running-t) – DrewJordan

+0

@DrewJordan: спасибо - это возможный подход, и может быть достаточно хорошим для моих целей, хотя он не охватывает один случай. В папке разработки кто-то может дважды щелкнуть по .exe. Они не будут «работать под визуальной студией»/«через IDE», но расположение файлов будет таким же, как если бы они это делали. – ToolmakerSteve

+0

Хмм. Я, вероятно, разрешу это, явно ищут файл в обоих возможных местах, если у меня еще нет базового пути. Затем кешируйте этот базовый путь для будущего доступа к контенту. – ToolmakerSteve

ответ

0

Я решил это явно ищет файл в двух возможных местах. Затем кеширование пути каталога для будущего доступа к контенту. В моем случае «место разработки» представляет собой папку «контент», расположенную рядом с папкой «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's 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 
Смежные вопросы