我正在開發VS2015的擴展,我需要獲取已打開解決方案的項目文件夾。然後找到bin文件夾以獲取輸出DLL。 所有這一切,因爲我需要使用反射從輸出DLL實例化一個類。如何在VSIX項目上獲取項目文件夾
我試圖從msdn獲取一些信息,但這很難理解。 有沒有辦法做到這一點?
在此先感謝
我正在開發VS2015的擴展,我需要獲取已打開解決方案的項目文件夾。然後找到bin文件夾以獲取輸出DLL。 所有這一切,因爲我需要使用反射從輸出DLL實例化一個類。如何在VSIX項目上獲取項目文件夾
我試圖從msdn獲取一些信息,但這很難理解。 有沒有辦法做到這一點?
在此先感謝
你可以嘗試這樣的事情......
找到感興趣的項目文件(可能啓動項目),或讓用戶選擇它。項目輸出目錄存儲在其項目文件中,因此應使用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來更改Platform
和Configuration
屬性。你可以試試這個...
...
var globalProperties = new Dictionary<string, string>()
{
{ "Configuration", "Debug" },
{ "Platform", "AnyCPU" }
};
var p = new Project(
projectFile,
globalProperties,
null,
projectCollection,
ProjectLoadSettings.Default);
...
感謝您的幫助,我只需要將「var p = new Project」(由於參考衝突改爲「new Microsoft.Build.Evaluation.Project」)。 –
解決方案本身不具有輸出文件夾,但解決方案可以包含多個項目 - 並且每個項目都有自己的it's輸出目錄(取決於所選擇的解決方案配置) 。 – Matze