2015-10-08 89 views
1

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

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

在此先感谢

+0

解决方案本身不具有输出文件夹,但解决方案可以包含多个项目 - 并且每个项目都有自己的it's输出目录(取决于所选择的解决方案配置) 。 – Matze

回答

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(); 
     } 
    } 
} 

上面提供将使用默认的项目生成配置的样本;我没有尝试过,但可能需要将全局属性传递给Project ctor来更改PlatformConfiguration属性。你可以试试这个...

... 

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

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

... 
+0

感谢您的帮助,我只需要将“var p = new Project”(由于参考冲突改为“new Microsoft.Build.Evaluation.Project”)。 –