我正在尝试将创建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;
}
}
这有可能吗?
花了一些时间后,根据a discussion on GitHub,似乎不可能做到这一点。
给出的答案是:
我认为.NET Core不支持直接编译针对System.Private.CoreLib.dll。一般来说,可能是不使用
dotnet
很难编译应用程序工具和MSBuild,因为您将必须有效地复制所有选择适当的参考程序集的逻辑,然后为.NET Core生成正确的执行环境共享加载程序。