Мне нужно написать файл в той же папке, где находится консоль ClickOnce .application
(исполняемый файл). Папка, из которой он запускается.
Я пытался использовать Application.StartupPath
&, Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
но путь указывает на подпапку в c:\Documents & Settings
. Как мне получить путь, где .application
находится?
Это правильно.
ClickOnce applications
установлены под профилем пользователя, который их установил. Вы взяли путь, который дал вам извлечение информации из исполняющей сборки, и пошли проверить это?В Windows Vista и Windows 7 вы найдете кеш ClickOnce здесь:
В Windows XP вы найдете это здесь:
источник
ApplicationDeployment.CurrentDeployment.ActivationUri может работать
«Строка нулевой длины, если свойство TrustUrlParameters в манифесте развертывания имеет значение false или если пользователь предоставил UNC для открытия развертывания или открыл его локально. В противном случае возвращаемое значение представляет собой полный URL-адрес, используемый для запуска приложения, включая любые параметры. "
НО я думаю, что вы действительно хотите, это ApplicationDeployment.CurrentDeployment.DataDirectory, которая дает вам папку, в которую вы можете записывать данные. В любом случае, когда вы обновите приложение, вы потеряете то, что было в исходной папке .exe, но вы можете перенести каталог данных в новую версию приложения. Ваше приложение может записывать в эту папку любые файлы журналов, которые оно имеет - и я уверен, что оно гарантированно доступно для записи.
источник
Я использую,
Assembly.GetExecutingAssembly().Location
чтобы получить путь кClickOnce
развернутому приложению в .Net 4.5.1.Однако вам не следует писать ни в одну папку, в которой ваше приложение развернуто, независимо от метода развертывания (xcopy, ClickOnce, InstallShield и т. Д.), Поскольку они обычно читаются только для приложений, особенно в новых версиях Windows и серверных средах.
Приложение всегда должно записывать в папки, зарезервированные для таких целей. Вы можете получить нужные вам папки, начиная с перечисления Environment.SpecialFolder. Страница MSDN объясняет, для чего предназначена каждая папка: http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
Т.е. для данных, журналов и других файлов можно использовать
ApplicationData
(роуминг),LocalApplicationData
(локальный) илиCommonApplicationData
. Для временных файлов используйтеPath.GetTempPath
илиPath.GetTempFileName
.Вышеперечисленное работает и на серверах, и на десктопах.
РЕДАКТИРОВАТЬ:
Assembly.GetExecutingAssembly()
вызывается в основном исполняемом файле.источник
ClickOnce приложения DO проживают в подкаталоге C: \ Documents & Settings. У них нет «чистых» установочных каталогов, потому что локальные файлы по существу «временно» загружаются, чтобы позволить приложению запускаться на локальном ПК, а выполнение приложения контролируется с сервера ClickOnce, на котором они развернуты, в зависимости от настроек публикации. (Проверка наличия обновлений, требований к версии и т. Д.).
источник
Вот что я обнаружил, и это помогло мне найти расположение развернутой папки моего приложения clickonce, и это нигде не было упомянуто в моих поисках для моего похожего специфического сценария:
Вот изображение моего варианта использования:
Я не нашел ни одного из предложений в этом вопросе или их комментариев для работы по возвращению папки, в которой было развернуто приложение clickonce (которую я затем переместил бы относительно этой папки, чтобы найти интересующую папку). Никакой другой интернет-поиск или связанные с этим вопросы так же не нашли ответа.
Все предложенные свойства либо не работали из-за того, что объект (например, ActivationUri) был нулевым, либо указывали на кешированную папку установленного приложения на локальном ПК. Да, я мог бы изящно обрабатывать нулевые объекты путем проверки IsNetworkDeployed - это не проблема - но удивительно, что IsNetworkDeployed возвращает false, даже если у меня действительно есть расположение развернутой в сети папки для приложения clickonce. Это связано с тем, что приложение выполняется из локальных кэшированных битов.
Решение состоит в том, чтобы посмотреть на:
AppDomain.CurrentDomain.BaseDirectory
когда приложение запускается в Visual Studio, как я разрабатываю иSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
когда он выполняется нормально.System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
правильно возвращает сетевой каталог, в котором развернуто мое приложение clickonce, во всех случаях. То есть когда он запускается через:Вот код, который я использую при запуске приложения, чтобы получить путь к папке WorkAccounts. Получить папку развернутого приложения просто, просто не переходя к родительским каталогам:
источник
Предполагая, что вопрос касается доступа к файлам в папке приложения после того, как приложение ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) установлено на ПК пользователя, существует три способа получить эту папку самим приложением:
Они работают из VS IDE и из развернутого / установленного приложения ClickedOnce, проверка «true == System.Deployment.ApplicationDeploy.IsNetworkDeployed» не требуется. ClickOnce выбирает любые файлы, включенные в проект Visual Studio 2017, поэтому приложение может получить доступ ко всем развернутым файлам, используя относительные пути из приложения.
Это основано на Windows 10 и Visual Studio 2017
источник