如何在VSIX项目上获取项目文件夹

时间:2015-10-08 10:29:08

标签: visual-studio-2015 visual-studio-extensions vsix vsx

我正在开发VS2015的扩展程序,我需要获取已打开解决方案的项目文件夹。然后找到bin文件夹以获取输出DLL。 这一切都是因为我需要使用反射从输出DLL中实例化一个类。

我试图从msdn获取一些信息,但我很难理解。 有没有办法做到这一点?

提前致谢

1 个答案:

答案 0 :(得分: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();
        }
    }
}

上面提供的示例将使用默认的项目构建配置;我没有尝试过,但可以通过将全局属性传递给Platform ctor来更改ConfigurationProject属性。你可以试试这个......

...

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

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

...