2015-10-08 88 views
1

我正在開發VS2015的擴展,我需要獲取已打開解決方案的項目文件夾。然後找到bin文件夾以獲取輸出DLL。 所有這一切,因爲我需要使用反射從輸出DLL實例化一個類。如何在VSIX項目上獲取項目文件夾

我試圖從msdn獲取一些信息,但這很難理解。 有沒有辦法做到這一點?

在此先感謝

+0

解決方案本身不具有輸出文件夾,但解決方案可以包含多個項目 - 並且每個項目都有自己的it's輸出目錄(取決於所選擇的解決方案配置) 。 – Matze

回答

1

你可以嘗試這樣的事情......

找到感興趣的項目文件(可能啓動項目),或讓用戶選擇它。項目輸出目錄存儲在其項目文件中,因此應使用MSBuild來讀取該信息,或者更好:讓MSBuild評估項目程序集的目標路徑屬性。您需要的是項目文件的絕對路徑,或者參考EnvDTE.Project

輸出組件的絕對路徑可以通過評估TargetPath屬性來獲得。您需要參考Microsoft.Build.dll部件,創建一個新的項目集合並通過創建Microsoft.Build.Evaluation.Project類的新實例來加載該項目。這將允許您查詢從項目和它們的評估值定義的屬性...

using Microsoft.Build.Evaluation; 

... 

public static string GetTargetPathFrom(EnvDTE.VsProject project) 
{ 
    const string PropertyName = "TargetPath"; 
    return GetPropertyValueFrom(project.FileName, PropertyName); 
} 

public static string GetPropertyValueFrom(string projectFile, string propertyName) 
{ 
    using (var projectCollection = new ProjectCollection()) 
    { 
     var p = new Project(
      projectFile, 
      null, 
      null, 
      projectCollection, 
      ProjectLoadSettings.Default); 

     return p.Properties 
      .Where(x => x.Name == propertyName) 
      .Select(x => x.EvaluatedValue) 
      .SingleOrDefault(); 
     } 
    } 
} 

上面提供將使用默認的項目生成配置的樣本;我沒有嘗試過,但可能需要將全局屬性傳遞給Project ctor來更改PlatformConfiguration屬性。你可以試試這個...

... 

var globalProperties = new Dictionary<string, string>() 
    { 
     { "Configuration", "Debug" }, 
     { "Platform", "AnyCPU" } 
    }; 

var p = new Project(
    projectFile, 
    globalProperties, 
    null, 
    projectCollection, 
    ProjectLoadSettings.Default); 

... 
+0

感謝您的幫助,我只需要將「var p = new Project」(由於參考衝突改爲「new Microsoft.Build.Evaluation.Project」)。 –