2011-03-30 41 views
3

我需要通過DTE獲取項目組件的絕對輸出路徑。我試着用this method,在那裏我將訪問OutputPath物業這樣做,與大會名稱合併,然而,這產生了相對路徑,如:通過DTE獲取項目TargetPath的宏值

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

使用Path.GetFullPath不好對我來說,因爲我的項目可能在另一個位置執行。

我注意到$(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中可用,但你總是可以反向移植它)

+0

謝謝,我更新了我的問題 – 2011-03-30 13:37:51

+0

我不知道我跟着你 - 在這種情況下,MyAssembly程序,該projectFolder變量將獲得值「C:\ MyProject \ Framework \ MyAssembly \「,輸出路徑將會得到」.. \ .. \ Output \ AnyCPU \ Debug \「,它們將根據請求生成路徑」C:\ MyProject \ Output \ AnyCPU \ Debug「,否? – 2011-03-30 13:50:57

+0

此外,我假設這是一個非常具體的場景,而不是一般的事情 - 在一般情況下,您不能輕易預先確定將從何處加載DLL(來自輸出文件夾,GAC,額外探測在.xml配置中指定的dirs等),所以我認爲你最好在運行時用AssemblyName交叉引用進程中加載​​的模塊列表。 – 2011-03-30 13:52:22