Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.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编译时自动解析依赖项_C#_.net_.net Core_Roslyn - Fatal编程技术网

C# 使用Roslyn编译时自动解析依赖项

C# 使用Roslyn编译时自动解析依赖项,c#,.net,.net-core,roslyn,C#,.net,.net Core,Roslyn,我目前正在编写一个应用程序,该应用程序当前通过Roslyn的workspace API加载一个项目,将指定的C#文件转换为语法树,然后创建内存中的汇编表单,最后提取IL 这一切都很好,但是只要我引用了上述C#文件中的任何外部库,编译就会失败,因为Roslyn不知道在哪里解析这些引用 以下是我目前所做工作的简化版本: MetadataReference[] metaDatareferences = { MetadataReference.CreateFromFile(typeof(obje

我目前正在编写一个应用程序,该应用程序当前通过Roslyn的workspace API加载一个项目,将指定的C#文件转换为语法树,然后创建内存中的汇编表单,最后提取IL

这一切都很好,但是只要我引用了上述C#文件中的任何外部库,编译就会失败,因为Roslyn不知道在哪里解析这些引用

以下是我目前所做工作的简化版本:

MetadataReference[] metaDatareferences = { MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location), MetadataReference.CreateFromFile(typeof(Uri).GetTypeInfo().Assembly.Location), MetadataReference.CreateFromFile(typeof(DynamicAttribute).GetTypeInfo().Assembly.Location), MetadataReference.CreateFromFile(typeof(AssemblyMetadata).GetTypeInfo().Assembly.Location), }; var sourceLanguage = new CSharpLanguage(); var syntaxTree = sourceLanguage.ParseText(sourceCode, SourceCodeKind.Regular); var options = new CSharpCompilationOptions( OutputKind.DynamicallyLinkedLibrary, optimizationLevel: OptimizationLevel.Debug, allowUnsafe: true ); CSharpCompilation compilation = CSharpCompilation.Create("ExampleAssembly", options: options); var stream = new MemoryStream(); var result = compilation. AddReferences(metaDatareferences) .AddSyntaxTrees(syntaxTree) .Emit(stream); // Success is false if (!emitResult.Success) { foreach (var diagnostic in emitResult.Diagnostics) { Debug.WriteLine(diagnostic.ToString()); } } 我的Roslyn项目正在读取的文件是:

using MediatR; namespace ConsoleApplication { public class Program { public static void Main(string[] args) { var mediator = new Mediator(null, null); } } } 使用MediatR; 命名空间控制台应用程序 { 公共课程 { 公共静态void Main(字符串[]args) { var mediator=new mediator(null,null); } } }
我的问题是,Roslyn是否为自动加载文件可能具有的任何依赖项提供了API?我希望Roslyn工作区能够实现这一点,但我没有找到任何东西。

如果MediatR控制台项目是
project.json
项目,那么您可以使用
Microsoft.DotNet.ProjectModel.workspace中的
ProjectJsonWorkspace
:“1.0.0-preview2-1-003177”
。您可以将它指向您的
project.json
并获得一个
编译
对象,这将为您完成所有获取项目引用、文件引用等的艰苦工作。。。然后你就可以从这里发射IL了

以下是一个例子:

var compilation = new ProjectJsonWorkspace(@"PathToYour\project.json").CurrentSolution.Projects.First().GetCompilationAsync().Result;

var stream = new MemoryStream();
var emitResult = compilation.Emit(stream);
或者,如果需要完全控制,可以继续使用
csharpcomilation.Create
,从此处的
compilation
对象复制所需内容,并传入一个
语法树


希望这会有所帮助。

您确定这是由于无法加载引用,而不是由于某些语法错误造成的吗?告诉我们编译器的确切错误。我已经更新了我的问题,包括错误输出和我正在阅读的文件。所以,你希望
使用MediatR指令将解析您的库?这就是为什么CSharpScript中有
#r
。即使是
MetadataReferences
也需要解析,请参阅。我能想到的实现这一点的唯一方法是#1编译#2检查已知错误,尝试添加引用,然后转到#1。但即使这样也不适用于共享名称空间的扩展方法等…@m0sa不,这不是C#Script文件。我的目的是编译一个从项目工作区中随机抽取的C#。当你说你正在“从项目”加载一个文件时,你是否有一个.csproj或project.json或其他东西可以查看?很好,
ProjectJsonWorkspace
正是我想要的,谢谢!
var compilation = new ProjectJsonWorkspace(@"PathToYour\project.json").CurrentSolution.Projects.First().GetCompilationAsync().Result;

var stream = new MemoryStream();
var emitResult = compilation.Emit(stream);