如何获取 VSIX 项目上的项目文件夹
How to get project folder on a VSIX project
我正在为 VS2015 开发一个扩展,我需要获取打开的解决方案的项目文件夹。然后找到bin文件夹得到输出的DLL。
这一切都是因为我需要使用反射从输出 DLL 中实例化一个 class。
我试图从 msdn 获取一些信息,但我很难理解。
有办法吗?
提前致谢
你可以试试这样的……
找到感兴趣的项目文件(可能是启动项目),或者让用户select它。项目输出目录存储在它的项目文件中,因此应该使用 MSBuild
来读取该信息,或者更好:让 MSBuild
评估项目程序集的目标路径 属性 .您需要的是项目文件的绝对路径,或 EnvDTE.Project
引用。
输出程序集的绝对路径可以通过计算 TargetPath
属性 获得。您需要引用 Microsoft.Build.dll
程序集,创建新的项目集合并通过创建 Microsoft.Build.Evaluation.Project
class 的新实例来加载项目。这将允许您从项目中查询定义的属性及其评估值...
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);
...
我正在为 VS2015 开发一个扩展,我需要获取打开的解决方案的项目文件夹。然后找到bin文件夹得到输出的DLL。 这一切都是因为我需要使用反射从输出 DLL 中实例化一个 class。
我试图从 msdn 获取一些信息,但我很难理解。 有办法吗?
提前致谢
你可以试试这样的……
找到感兴趣的项目文件(可能是启动项目),或者让用户select它。项目输出目录存储在它的项目文件中,因此应该使用 MSBuild
来读取该信息,或者更好:让 MSBuild
评估项目程序集的目标路径 属性 .您需要的是项目文件的绝对路径,或 EnvDTE.Project
引用。
输出程序集的绝对路径可以通过计算 TargetPath
属性 获得。您需要引用 Microsoft.Build.dll
程序集,创建新的项目集合并通过创建 Microsoft.Build.Evaluation.Project
class 的新实例来加载项目。这将允许您从项目中查询定义的属性及其评估值...
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);
...