ClickOnce 응용 프로그램의 폴더 경로를 얻는 방법
콘솔 ClickOnce .application
(실행 파일) 가있는 동일한 폴더에 파일을 작성해야 합니다. 폴더가 시작되는 폴더입니다.
Application.StartupPath
&를 사용해 보았지만 Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
경로가 아래의 하위 폴더를 가리키고 c:\Documents & Settings
있습니다. 거주자가있는 경로를 어떻게 알 수 .application
있습니까?
폴더 위치를 찾으려면 앱을 실행하고 작업 관리자 (CTRL-SHIFT-ESC)를 열고 앱을 선택한 다음 파일 위치를 마우스 오른쪽 버튼으로 클릭하면됩니다.
경로가 c : \ Documents & Settings에서 하위 폴더를 가리키고 있습니다.
맞습니다. ClickOnce applications
설치 한 사용자의 프로필 아래에 설치됩니다. 실행중인 어셈블리에서 정보를 검색 한 경로를 확인하고 확인 했습니까?
Windows Vista 및 Windows 7의 경우 ClickOnce 캐시가 여기에 있습니다.
c:\users\username\AppData\Local\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername
Windows XP의 경우 여기에서 찾을 수 있습니다.
C:\Documents and Settings\username\LocalSettings\Apps\2.0\obfuscatedfoldername\obfuscatedfoldername
ApplicationDeployment.CurrentDeployment.ActivationUri 가 작동 할 수 있습니다
"배치 매니페스트의 TrustUrlParameters 속성이 false이거나 사용자가 UNC를 제공하여 배포를 열거 나 로컬에서 열면 길이가 0 인 문자열입니다. 그렇지 않으면 반환 값은 응용 프로그램을 시작하는 데 사용되는 전체 URL입니다. 모든 매개 변수를 포함합니다. "
그러나 실제로 원하는 것은 ApplicationDeployment.CurrentDeployment.DataDirectory 이며 데이터를 쓸 수있는 폴더를 제공합니다. 어쨌든 응용 프로그램을 업데이트하면 원래 .exe 폴더에 있던 내용이 손실되지만 데이터 디렉토리를 새 버전의 앱으로 마이그레이션 할 수 있습니다. 귀하의 앱은 모든 로그 파일을 사용 하여이 폴더에 쓸 수 있으며 쓰기 가능하다고 확신합니다.
.Net 4.5.1에서 배포 된 응용 프로그램 Assembly.GetExecutingAssembly().Location
의 경로를 얻는 데 사용 하고 ClickOnce
있습니다.
그러나 배포 방법 (xcopy, ClickOnce, InstallShield 등)에 관계없이 응용 프로그램이 배포 된 폴더에는 일반적으로 응용 프로그램, 특히 최신 Windows 버전 및 서버 환경에서 읽기 전용이므로 폴더에 쓰면 안됩니다.
앱은 항상 그러한 목적으로 예약 된 폴더에 기록해야합니다. Environment.SpecialFolder Enumeration에서 필요한 폴더를 얻을 수 있습니다. MSDN 페이지는 각 폴더의 용도를 설명합니다. http://msdn.microsoft.com/en-us/library/system.environment.specialfolder.aspx
즉, 데이터, 로그 및 기타 파일 ApplicationData
(로밍), LocalApplicationData
(로컬) 또는을 사용할 수 있습니다 CommonApplicationData
. 임시 파일의 경우 Path.GetTempPath
또는을 사용하십시오 Path.GetTempFileName
.
위의 내용은 서버 및 데스크탑에서도 작동합니다.
편집 : Assembly.GetExecutingAssembly()
기본 실행 파일에서 호출됩니다.
ClickOnce를 응용 프로그램은 DO C의 하위 디렉토리에 상주을 : \ 문서 및 설정. 로컬 파일은 로컬 PC에서 응용 프로그램을 실행할 수 있도록 기본적으로 "일시적으로"다운로드되고 응용 프로그램 실행은 게시 설정에 따라 배포 된 ClickOnce 서버에서 제어되므로 "깨끗한"설치 디렉토리가 없습니다. (업데이트, 버전 요구 사항 확인 등).
철저한 검색 후 마침내 레지스트리를 통해 난독 화 된 폴더 이름을 찾는 방법을 찾았습니다. 다음은이를 가져 오는 간단한 방법입니다.
private static Tuple<string, string> GetClickonceDirectories()
{
var appToken = (string) Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0", "ComponentStore_RandomString", null);
var dataToken = (string) Registry.GetValue(@"HKEY_CURRENT_USER\SOFTWARE\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\StateManager", "StateStore_RandomString", null);
if (string.IsNullOrWhiteSpace(appToken) || string.IsNullOrWhiteSpace(dataToken))
{
throw new Exception("Unable to find clickonce directories.");
}
var appDir =
$@"{appToken.Substring(0, 8)}.{appToken.Substring(8, 3)}\{appToken.Substring(11, 8)}.{appToken.Substring(19, 3)}";
var dataDir =
$@"Data\{dataToken.Substring(0, 8)}.{dataToken.Substring(8, 3)}\{dataToken.Substring(11, 8)}.{dataToken.Substring(19, 3)}";
var rootPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
rootPath = Path.Combine(rootPath, "Apps", "2.0");
return new Tuple<string, string>(Path.Combine(rootPath, appDir), Path.Combine(rootPath, dataDir));
}
clickonce 응용 프로그램의 배포 된 폴더 위치를 얻을 수 있었고 비슷한 특정 시나리오를 위해 검색에서 본 곳에서는 언급되지 않은 것으로 나타났습니다.
- The clickonce application is deployed to a company LAN network folder.
- The clickonce application is set to be available online or offline.
- My clickonce installation URL and Update URLs in my project properties have nothing specified. That is, there is no separate location for installation or updates.
- In my publishing options, I am having a desktop shortcut created for the clickonce application.
- The folder I want to get the path for at startup is one that I want to be accessed by the DEV, INT, and PROD versions of the application, without hardcoding the path.
Here is a visual of my use case:
- The blue boxed folders are my directory locations for each environment's application.
- The red boxed folder is the directory I want to get the path for (which requires first getting the app's deployed folder location "MyClickOnceGreatApp_1_0_0_37" which is the same as the OP).
I did not find any of the suggestions in this question or their comments to work in returning the folder that the clickonce application was deployed to (that I would then move relative to this folder to find the folder of interest). No other internet searching or related SO questions turned up an answer either.
All of the suggested properties either were failing due to the object (e.g. ActivationUri) being null, or were pointing to the local PC's cached installed app folder. Yes, I could gracefully handle null objects by a check for IsNetworkDeployed - that's not a problem - but surprisingly IsNetworkDeployed returns false even though I do in fact have a network deployed folder location for the clickonce application. This is because the application is running from the local, cached bits.
The solution is to look at:
AppDomain.CurrentDomain.BaseDirectory
when the application is being run within visual studio as I develop andSystem.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
when it is executing normally.
System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation
correctly returns the network directory that my clickonce application is deployed to, in all cases. That is, when it is launched via:
- setup.exe
- MyClickOnceGreatApp.application
- The desktop shortcut created upon first install and launch of the application.
Here's the code I use at application startup to get the path of the WorkAccounts folder. Getting the deployed application folder is simple by just not marching up to parent directories:
string directoryOfInterest = "";
if (System.Diagnostics.Debugger.IsAttached)
{
directoryOfInterest = Directory.GetParent(Directory.GetParent(Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).FullName).FullName).FullName;
}
else
{
try
{
string path = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
path = path.Replace("file:", "");
path = path.Replace("/", "\\");
directoryOfInterest = Directory.GetParent(Directory.GetParent(path).FullName).FullName;
}
catch (Exception ex)
{
directoryOfInterest = "Error getting update directory needed for relative base for finding WorkAccounts directory.\n" + ex.Message + "\n\nUpdate location directory is: " + System.Deployment.Application.ApplicationDeployment.CurrentDeployment.UpdateLocation.ToString();
}
}
Assuming the question is about accessing files in the application folder after the ClickOnce (true == System.Deployment.ApplicationDeploy.IsNetworkDeployed) application is installed on the user's PC, their are three ways to get this folder by the application itself:
String path1 = System.AppDomain.CurrentDomain.BaseDirectory;
String path2 = System.IO.Directory.GetCurrentDirectory();
String path3 = System.Reflection.Assembly.GetExecutingAssembly().CodeBase; //Remove the last path component, the executing assembly itself.
These work from VS IDE and from a deployed/installed ClickedOnce app, no "true == System.Deployment.ApplicationDeploy.IsNetworkDeployed" check required. ClickOnce picks up any files included in the Visual Studio 2017 project so really the application can access any and all deployed files using relative paths from within the application.
This is based on Windows 10 and Visual Studio 2017
참고URL : https://stackoverflow.com/questions/2359026/how-to-get-folder-path-for-clickonce-application
'Programing' 카테고리의 다른 글
MYSQL이 더 높은 LIMIT 오프셋으로 인해 쿼리 속도가 느려지는 이유는 무엇입니까? (0) | 2020.06.07 |
---|---|
어떤 Linux / Unix 명령이 구식이며 강력한 대안이 있습니까? (0) | 2020.06.07 |
문자열의 마지막 두 문자를 선택하는 방법 (0) | 2020.06.07 |
호스트 요소에“클래스”를 추가하는 방법은 무엇입니까? (0) | 2020.06.07 |
'--color'및 '--format specdoc'옵션을 유지하도록 RSpec을 전역 적으로 구성하는 방법 (0) | 2020.06.07 |