是否可以使用Roslyn构建ASP.Net Core Web应用程序?

问题描述 投票:-1回答:1

我正在尝试将创建ASP.NetCore Web应用程序所需的所有代码放在一个文本文件中,然后在ASP.Net Core 3.1应用程序中读取它,并使用Roslyn进行编译并将其另存为dll文件。我试了很多我可以针对控制台应用程序执行此操作,但不能针对Web应用程序执行此操作。这是我所做的

public void Load(string id, string code, IEnumerable<string> allowedAssemblyNames, IEnumerable<Type> allowedTypes, string path)
{
    try
    {
        var _references = new List<MetadataReference>();
        foreach (var assemblyName in allowedAssemblyNames)
        {
            _references.Add(MetadataReference.CreateFromFile(RuntimeEnvironment.GetRuntimeDirectory() + assemblyName + ".dll"));
        }

        foreach (var type in allowedTypes)
        {
            _references.Add(MetadataReference.CreateFromFile(type.Assembly.Location));
        }
        _references.Add(MetadataReference.CreateFromFile(Assembly.Load("netstandard").Location));


        var options = new CSharpCompilationOptions(
            OutputKind.DynamicallyLinkedLibrary,
            reportSuppressedDiagnostics: true,
            optimizationLevel: OptimizationLevel.Release,
            generalDiagnosticOption: ReportDiagnostic.Error,
            allowUnsafe: false);

        var syntaxTree = CSharpSyntaxTree.ParseText(code, options: new CSharpParseOptions(LanguageVersion.Latest, kind: SourceCodeKind.Regular));
        var compilation = CSharpCompilation.Create(id, new[] { syntaxTree }, _references, options);

        assemblyLoadContext = new AssemblyLoadContext(id, true);

        using (var ms = new MemoryStream())
        {
            var result = compilation.Emit(ms);
            if (result.Success)
            {
                ms.Seek(0, SeekOrigin.Begin);
                bytes = ms.ToArray();
                File.WriteAllBytes(path, bytes);
                ms.Seek(0, SeekOrigin.Begin);
                assembly = assemblyLoadContext.LoadFromStream(ms);
            }
        }
    }
    catch (Exception ex)
    {
        throw;
    }

}

这有可能吗?

c# .net-core roslyn roslyn-code-analysis
1个回答
0
投票

花了一些时间后,根据a discussion on GitHub,似乎不可能做到这一点。

给出的答案是:

我认为.NET Core不支持直接编译针对System.Private.CoreLib.dll。一般来说,可能是不使用dotnet很难编译应用程序工具和MSBuild,因为您将必须有效地复制所有选择适当的参考程序集的逻辑,然后为.NET Core生成正确的执行环境共享加载程序。

© www.soinside.com 2019 - 2024. All rights reserved.