Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Roslyn:工作区在控制台应用程序中加载,但不在msbuild任务中加载_C#_Windows_Roslyn - Fatal编程技术网

C# Roslyn:工作区在控制台应用程序中加载,但不在msbuild任务中加载

C# Roslyn:工作区在控制台应用程序中加载,但不在msbuild任务中加载,c#,windows,roslyn,C#,Windows,Roslyn,我使用以下命令执行自定义msbuild任务: var workspace = Workspace.LoadStandAloneProject(csprojPath); 当我运行它时,它抛出以下错误: System.InvalidCastException was unhandled by user code Message=Unable to cast transparent proxy to type 'Roslyn.Utilities.SerializableDataStorage'.

我使用以下命令执行自定义msbuild任务:

var workspace = Workspace.LoadStandAloneProject(csprojPath);
当我运行它时,它抛出以下错误:

System.InvalidCastException was unhandled by user code Message=Unable to cast transparent proxy to type 'Roslyn.Utilities.SerializableDataStorage'. Source=Roslyn.Services StackTrace: at Roslyn.Utilities.RemoteServices.CreateInstance[T]() at Roslyn.Services.Host.TemporaryStorageServiceFactory.CreateService(IWorkspaceServiceProvider workspaceServices) at Roslyn.Services.Host.WorkspaceServiceProviderFactory.Provider.c__DisplayClass7.b__4() at Roslyn.Utilities.NonReentrantLazy`1.get_Value() at Roslyn.Services.Host.WorkspaceServiceProviderFactory.Provider.GetService[TWorkspaceService]() at Roslyn.Services.SolutionServices..ctor(IWorkspaceServiceProvider workspaceServices, ILanguageServiceProviderFactory languageServicesFactory) at Roslyn.Services.Solution..ctor(SolutionId id, String filePath, VersionStamp version, VersionStamp latestProjectVersion, ILanguageServiceProviderFactory languageServiceProviderFactory, IWorkspaceServiceProvider workspaceServices) at Roslyn.Services.Host.SolutionFactoryServiceFactory.SolutionFactoryService.CreateSolution(SolutionId id) at Roslyn.Services.Host.TrackingWorkspace.CreateNewSolution(ISolutionFactoryService solutionFactory, SolutionId id) at Roslyn.Services.Host.TrackingWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider, Boolean enableBackgroundCompilation, Boolean enableInProgressSolutions) at Roslyn.Services.Host.HostWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider, Boolean enableBackgroundCompilation, Boolean enableInProgressSolutions, Boolean enableFileTracking) at Roslyn.Services.Host.LoadedWorkspace..ctor(ILanguageServiceProviderFactory languageServiceProviderFactory, IWorkspaceServiceProvider workspaceServiceProvider, IProjectFileService projectFileFactsService, IDictionary`2 globalProperties, Boolean enableBackgroundCompilation, Boolean enableFileTracking) at Roslyn.Services.Host.LoadedWorkspace..ctor(ExportProvider exportProvider, Boolean solutionLoadOnly, Boolean enableFileTracking) at Roslyn.Services.Host.LoadedWorkspace..ctor(Boolean enableFileTracking) at Roslyn.Services.Host.LoadedWorkspace.LoadStandAloneProject(String projectFileName, String configuration, String platform, String language, Boolean enableFileTracking) at Roslyn.Services.Workspace.LoadStandAloneProject(String projectFileName, String configuration, String platform, String language, Boolean enableFileTracking) ... 用户代码未处理System.InvalidCastException Message=无法将透明代理强制转换为类型“Roslyn.Utilities.SerializableDataStorage”。 Source=Roslyn.Services 堆栈跟踪: 在Roslyn.Utilities.RemoteServices.CreateInstance[T]() 位于Roslyn.Services.Host.TemporaryStorageServiceFactory.CreateService(IWorkspaceServiceProvider workspaceServices) 位于Roslyn.Services.Host.WorkspaceServiceProviderFactory.Provider.c__DisplayClass7.b__u4() 在Roslyn.Utilities.nonretentlazy`1.get_Value() 位于Roslyn.Services.Host.WorkspaceServiceProviderFactory.Provider.GetService[TWorkspaceService]() 在Roslyn.Services.SolutionServices..ctor(IWorkspaceServiceProvider workspaceServices、ILanguageServiceProviderFactory languageServicesFactory) 位于Roslyn.Services.Solution..ctor(SolutionId id、字符串文件路径、VersionStamp版本、VersionStamp最新项目版本、ILanguageServiceProviderFactory languageServiceProviderFactory、IWorkspaceServiceProvider workspaceServices) 位于Roslyn.Services.Host.SolutionFactoryServiceFactory.SolutionFactoryService.CreateSolution(SolutionId) 位于Roslyn.Services.Host.TrackingWorkspace.CreateNewSolution(ISolutionFactoryService solutionFactory,SolutionId) 位于Roslyn.Services.Host.TrackingWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider,布尔启用背景编译,布尔启用InProgressSolutions) 位于Roslyn.Services.Host.HostWorkspace..ctor(IWorkspaceServiceProvider workspaceServiceProvider、Boolean enableBackgroundCompilation、Boolean enableInProgressSolutions、Boolean enableFileTracking) 在Roslyn.Services.Host.LoadedWorkspace..ctor(ILanguageServiceProviderFactory languageServiceProviderFactory、IWorkspaceServiceProvider workspaceServiceProvider、IProjectFileService projectFileFactsService、IDictionary`2全局属性、布尔启用背景编译、布尔启用文件跟踪) 位于Roslyn.Services.Host.LoadedWorkspace..ctor(ExportProvider ExportProvider、Boolean solutionLoadOnly、Boolean enableFileTracking) 位于Roslyn.Services.Host.LoadedWorkspace..ctor(布尔启用文件跟踪) 位于Roslyn.Services.Host.LoadedWorkspace.LoadStandAloneProject(字符串项目文件名、字符串配置、字符串平台、字符串语言、布尔启用文件跟踪) 位于Roslyn.Services.Workspace.LoadStandAloneProject(字符串项目文件名、字符串配置、字符串平台、字符串语言、布尔启用文件跟踪) ... 相同的代码在控制台应用程序中使用相同的项目运行时运行良好


有什么想法吗?谷歌搜索没有任何帮助

这是MSBuild的一个限制。Roslyn无法在生成过程中递归调用MSBuild以确定项目属性/文件/引用。要在生成任务中创建Roslyn
IProject
,请尝试改用
LoadFromCommandLineArgs()
方法。您将需要构造任务,使其采用与CscTask最终传递给编译器相同的参数


希望这有帮助

下面是Roslyn的MsBuild任务示例

为了重建Workspace.LoadProjectFromCommandLineArguments方法所需的命令行,我们必须将一些信息从msbuild文件传递到任务中

  • 引用的程序集: @(ReferencePath)项目组
  • 要编译的cs文件:@(编译)项组
  • 基本目录:$(MSBuildProjectDirectory)内置属性
这就是Roslyn解析源文件所需的全部内容。(请参阅本文末尾的注释。)

因此,创建一个C#类库项目。 以下是您需要的项目参考:

Microsoft.Build.Framework
Microsoft.Build.Utilities.v4.0
Roslyn.Compilers
Roslyn.Services
自定义MsBuild任务的代码:

using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Roslyn.Services;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace RoslynMsBuildTask
{
    public class RoslynTask : Task
    {
        [Required]
        public ITaskItem[] ReferencePath { get; set; }

        [Required]
        public ITaskItem[] Compile { get; set; }

        [Required]
        public ITaskItem BaseDirectory { get; set; }

        public override bool Execute()
        {
            Log.LogMessage(MessageImportance.High, "RoslynTask.Execute called...\n");

            // Format the command line with the minimal info needed for Roslyn to create a workspace.
            var commandLineForProject = string.Format("/reference:{0} {1}",
                ReferencePath.Select(i => i.ItemSpec).ToSingleString(",", "\"", "\""),
                Compile.Select(i => i.ItemSpec).ToSingleString(" ", "\"", "\""));

            // Create the Roslyn workspace.
            var workspace = Workspace.LoadProjectFromCommandLineArguments("MyProject", "C#", commandLineForProject, BaseDirectory.ItemSpec);

            // Make sure that Roslyn actually parsed the project: dump the source from a syntax tree to the build log.
            Log.LogMessage(MessageImportance.High, workspace.CurrentSolution.Projects.First()
                .Documents.First(i => i.FilePath.EndsWith(".cs")).GetSyntaxRoot().GetText().ToString());

            return true;
        }
    }

    public static class IEnumerableExtension
    {
        public static string ToSingleString<T>(this IEnumerable<T> collection, string separator, string leftWrapper, string rightWrapper)
        {
            var stringBuilder = new StringBuilder();

            foreach (var item in collection)
            {
                if (stringBuilder.Length > 0)
                {
                    if (!string.IsNullOrEmpty(separator))
                        stringBuilder.Append(separator);
                }

                if (!string.IsNullOrEmpty(leftWrapper))
                    stringBuilder.Append(leftWrapper);

                stringBuilder.Append(item.ToString());

                if (!string.IsNullOrEmpty(rightWrapper))
                    stringBuilder.Append(rightWrapper);
            }

            return stringBuilder.ToString();
        }
    }
}
使用Microsoft.Build.Framework;
使用Microsoft.Build.Utilities;
使用Roslyn.Services;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
名称空间RoslynMsBuildTask
{
公共类任务:任务
{
[必需]
公共ITaskItem[]引用路径{get;set;}
[必需]
公共ITaskItem[]编译{get;set;}
[必需]
公共ITaskItem基目录{get;set;}
公共重写bool Execute()
{
LogMessage(MessageImportance.High,“roslynstask.Execute”调用…\n);
//使用Roslyn创建工作区所需的最少信息格式化命令行。
var commandLineForProject=string.Format(“/reference:{0}{1}”,
ReferencePath.Select(i=>i.ItemSpec).ToSingleString(“,”,“\”,“\”,“\”),
Compile.Select(i=>i.ItemSpec.ToSingleString(“,“\”,“\”);
//创建Roslyn工作区。
var workspace=workspace.LoadProjectFromCommandLineArguments(“MyProject”、“C#”、commandLineForProject、BaseDirectory.ItemSpec);
//确保Roslyn确实解析了项目:将源代码从语法树转储到构建日志。
LogMessage(MessageImportance.High,workspace.CurrentSolution.Projects.First()
.Documents.First(i=>i.FilePath.EndsWith(“.cs”).GetSyntaxRoot().GetText().ToString());
返回true;
}
}
公共静态类IEnumerableExtension
{
公共静态字符串到SingleString(此IEnumerable集合、字符串分隔符、字符串leftWrapper、字符串rightWrapper)
{
var stringBuilder=新的stringBuilder();
foreach(集合中的var项)
{
如果(stringBuilder.Length>0)
{
如果(!string.IsNullOrEmpty(分隔符))
stringBuilder.Append(分隔符);
}
如果(!string.IsNullOrEmpty(leftWrapp
  <Target Name="AfterBuild" DependsOnTargets="RoslynTask"/>
  <UsingTask AssemblyFile="$(OutputPath)\RoslynMsBuildTask.dll" TaskName="RoslynMsBuildTask.RoslynTask" />
  <Target Name="RoslynTask">
    <RoslynTask ReferencePath="@(ReferencePath)" Compile="@(Compile)" BaseDirectory="$(MSBuildProjectDirectory)" />
  </Target>