Visual studio 2015 如何获取VSIX项目上的项目文件夹

Visual studio 2015 如何获取VSIX项目上的项目文件夹,visual-studio-2015,visual-studio-extensions,vsix,vsx,Visual Studio 2015,Visual Studio Extensions,Vsix,Vsx,我正在为VS2015开发一个扩展,我需要获取打开的解决方案的项目文件夹。然后找到bin文件夹以获取输出DLL。 所有这些都是因为我需要使用反射从输出DLL实例化一个类 我试图从msdn获得一些信息,但很难理解。 有办法做到这一点吗 提前谢谢你可以试试这样的东西 找到感兴趣的项目文件(可能是启动项目),或者让用户选择它。项目输出目录存储在它的项目文件中,因此应该使用MSBuild读取该信息,或者更好的方法:让MSBuild计算项目程序集的目标路径属性。您需要的是项目文件的绝对路径,或者是EnvDT

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

我试图从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();
        }
    }
}
上面提供的示例将使用默认的项目构建配置;我还没有尝试过,但通过将全局属性传递给
项目
ctor,可以更改
平台
配置
属性。你可以试试这个

...

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

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

...
。。。
var globalProperties=新字典()
{
{“配置”,“调试”},
{“平台”、“任何CPU”}
};
var p=新项目(
项目文件,
全球财产,
无效的
项目集合,
ProjectLoadSettings.Default);
...

解决方案本身没有输出文件夹,但解决方案可以包含多个项目,每个项目都有自己的输出目录(取决于所选的解决方案配置)。感谢帮助,我只需将“var p=new project”(改为“new Microsoft.Build.Evaluation.project”)由于引用冲突,“Properties”不包含“Where”的定义,并且找不到可访问的扩展方法“Where”,其中“接受类型为“Properties”的第一个参数”