gpt4 book ai didi

c# - 使用 Roslyn 时,控制台不包含 ReadKey 的定义

转载 作者:行者123 更新时间:2023-11-30 12:56:10 31 4
gpt4 key购买 nike

我正在尝试动态编译代码并在运行时执行它。所以我关注了http://www.tugberkugurlu.com/archive/compiling-c-sharp-code-into-memory-and-executing-it-with-roslyn作为指南。

示例中给出的代码可以完美运行。但是,如果我使用 Console.ReadKey(),它会给我错误 CS0117: 'Console' does not contain a definition for 'ReadKey'。我在某处读到这是因为 dotnet 核心不支持 ReadKey ( 'Console' does not contain a definition for 'ReadKey' in asp.net 5 console App ),但我目前正在使用 "Microsoft.NETCore.App" 并且它 Console.ReadKey() 如果我在代码中显式使用它而不是在使用 Roslyn 时,它会完美地工作。

  • 这是 Roslyn 的问题还是我做错了什么?
  • "Microsoft.NETCore.App"dotnet core 是一回事吗?我怀疑我可能正在使用其他东西作为我的目标(这允许我使用 ReadKey)和带有 Roslyn 的 dotnet 核心
  • 是否可以将 Roslyn 的目标更改为其他目标?

提前致谢。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Loader;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.Emit;

namespace DemoCompiler
{
class Program
{
public static void roslynCompile()
{
string code = @"
using System;
using System.Text;

namespace RoslynCompileSample
{
public class Writer
{
public void Write(string message)
{
Console.WriteLine(message);
Console.ReadKey();
}
}
}";
SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText(code);

string assemblyName = Path.GetRandomFileName();
MetadataReference[] references = new MetadataReference[]
{
MetadataReference.CreateFromFile(typeof(object).GetTypeInfo().Assembly.Location),
MetadataReference.CreateFromFile(typeof(Enumerable).GetTypeInfo().Assembly.Location)
};

CSharpCompilation compilation = CSharpCompilation.Create(
assemblyName,
syntaxTrees: new[] { syntaxTree },
references: references,
options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));

using (var ms = new MemoryStream())
{
EmitResult result = compilation.Emit(ms);

if (!result.Success)
{
IEnumerable<Diagnostic> failures = result.Diagnostics.Where(diagnostic =>
diagnostic.IsWarningAsError ||
diagnostic.Severity == DiagnosticSeverity.Error);

foreach (Diagnostic diagnostic in failures)
Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage());
}
else
{
ms.Seek(0, SeekOrigin.Begin);
Assembly assembly = AssemblyLoadContext.Default.LoadFromStream(ms);
var type= assembly.GetType("RoslynCompileSample.Writer");
var instance = assembly.CreateInstance("RoslynCompileSample.Writer");
var meth = type.GetMember("Write").First() as MethodInfo;
meth.Invoke(instance, new [] {assemblyName});
}
}

}
}
}

编辑:我试图引用 System.Console.dll 但我在它和 System.Private.CoreLib 之间遇到了冲突。我该如何解决?

最佳答案

一种方法是添加 <PreserveCompilationContext>true</PreserveCompilationContext> * 添加到您的项目文件,然后使用 Microsoft.Extensions.DependencyModel.DependencyContext获取当前项目的所有引用程序集:

var references = DependencyContext.Default.CompileLibraries
.SelectMany(l => l.ResolveReferencePaths())
.Select(l => MetadataReference.CreateFromFile(l));

这似乎避免了您遇到的错误,但会导致如下警告:

warning CS1701: Assuming assembly reference 'System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' used by 'System.Console' matches identity 'System.Runtime, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' of 'System.Runtime', you may need to supply runtime policy

As far as I can tell, this should not be an issue.


* 这假设您使用的是 csproj/VS2017。如果您仍在使用 project.json/VS2015,同样可以使用 "buildOptions": { "preserveCompilationContext": true } 完成.

关于c# - 使用 Roslyn 时,控制台不包含 ReadKey 的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42765121/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com