Можно ли создать веб-приложение ASP. Net Core с использованием Roslyn? - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь поместить все коды, необходимые для создания веб-приложения ASP .NetCore, в текстовый файл, а затем прочитать его в приложении ASP. Net Core 3.1 и скомпилировать его с помощью Roslyn и сохраните его как файл dll. Я много пробовал. Я мог бы сделать это для консольного приложения, но не для веб-приложения. Это то, что я сделал

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

}

Возможно ли это вообще?

1 Ответ

1 голос
/ 31 января 2020

Потратив некоторое время на это, основываясь на обсуждении на GitHub , кажется, что это невозможно сделать.

Ответ дан:

Я считаю, что он не поддерживается. NET Ядро для компиляции непосредственно против System.Private.CoreLib.dll. В целом, вероятно, будет довольно сложно скомпилировать приложение без использования инструмента dotnet и MSBuild, поскольку вам придется эффективно реплицировать все логи c, которые используются для выбора соответствующих эталонных сборок, а затем генерировать правильное выполнение. среда для общего загрузчика. NET.

...