2011-03-30 3 views
3

DTE를 통해 프로젝트 어셈블리의 절대 출력 경로를 얻어야합니다. Path.GetFullPath를 사용DTE를 통해 프로젝트의 TargetPath 매크로 값 가져 오기

..\..\Output\AnyCPU\Debug\MyAssembly.dll

좋지 않다 : 그러나 나는이 같은 상대 경로를 생산, 어셈블리 이름과 결합, 나는 OutputPath 속성에 액세스 할 this method를 사용하여이 일을 시도 왜냐하면 내 프로젝트가 다른 위치에서 실행될 수 있기 때문입니다.

프로젝트 속성의 빌드 이벤트 탭에있는 $ (TargetPath) 매크로에 어셈블리의 전체 경로가 포함되어있는 것으로 나타났습니다. DTE에서이 값을 프로그래밍 방식으로 액세스하려면 어떻게해야합니까?

실제 질문은 - 프로젝트의 절대 출력 경로를 어떻게 얻습니까?

답변

2

프로그래밍 방식으로 "$ (TargetPath)"에 액세스하는 방법을 모르겠지만 그게 최선의 해결책 일 수 있다는 것에 동의합니다.

그러나 OutputPath 속성은 프로젝트 파일이있는 폴더와 관련되어 있으므로 앞서 언급 한 방법을 사용할 수 있어야합니다. (나는 몇 가지 시나리오를 누락하는 경우 그렇지 않은 경우 알려 주시기 바랍니다?)

그래서이 비슷한 수행 할 수 있습니다

 private static string GetProjectExecutable(Project startupProject, Configuration config) 
    { 
     string projectFolder = Path.GetDirectoryName(startupProject.FileName); 
     string outputPath  = (string)config.Properties.Item("OutputPath").Value; 
     string assemblyFileName = (string)startupProject.Properties.Item("AssemblyName").Value + ".exe"; 
     return Path.Combine(new[] { 
             projectFolder, 
             outputPath, 
             assemblyFileName 
            }); 
    } 

(여기에 사용 Path.Combine의 과부하입니다 .NET 4.0에서만 사용할 수 있지만 항상 backport 할 수 있습니다.

+0

감사합니다. 내 질문이 업데이트되었습니다. –

+0

나는이 경우 MyAssembly에서 projectFolder 변수의 값이 "C : \"가 될 것이라고 확신하지 않습니다. MyProject \ Framework \ MyAssembly \ "이면 outputPath는".. \ .. \ Output \ AnyCPU \ Debug \ "와 함께"C : \ MyProject \ Output \ AnyCPU \ Debug "경로를 요청한 것처럼 만듭니다. –

+0

또한, 저는 이것이 매우 특정한 시나리오라고 가정합니다. 일반적인 경우가 아닙니다. 일반적으로 DLL이 어디에서로드 될지 쉽게 미리 결정할 수 없습니다 (출력 폴더, GAC, 추가 probing dirs .xml config에 지정된 등), 그래서 당신은 더 나은 AssemblyName과 런타임에 프로세스에서로드 된 모듈의 목록을 참조하는 것이 좋을 것 같아요. –