我正在开发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