调用CSharpCompilation.Emit时无法加载System.Security.Cryptography.Algorithms错误

问题描述

我正在尝试使用CSharpCompilation.Emit方法创建一个内存中程序集,但是出于某些奇怪的原因,它总是抛出一个异常,表明它无法加载System.Security.Cryptography.Algorithms。运行的项目是.netstandard,但是启动项目是.net框架,不确定是否重要。

代码如下:

  var assemblies = AppDomain.CurrentDomain.GetAssemblies();
            var assemblyPath = Path.GetDirectoryName(typeof(object).Assembly.Location);
            var netstandardAssembly =
                assemblies.First(x => !x.IsDynamic && x.Location.Contains("netstandard"));   

            MetadataReference[] references = {
                MetadataReference.CreateFromFile(netstandardAssembly.Location),MetadataReference.CreateFromFile(Path.Combine(assemblyPath,"System.dll")),"System.Core.dll")),"Microsoft.CSharp.dll")),"mscorlib.dll")),"System.Data.dll")),"System.Runtime.dll")),MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location)
            };

   CSharpCompilation compilation =
                CSharpCompilation.Create(name)
                    .WithOptions(new CSharpCompilationoptions(OutputKind.DynamicallyLinkedLibrary))
                    .WithReferences(references)
                    .AddSyntaxTrees(CSharpSyntaxTree.ParseText(@"namespace Example.Main
{
    public class Class1
    {
        
    }
}"));

            try
            {
                byte[] assemblyBytes;
                using (MemoryStream ms = new MemoryStream())
                {
                    var 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)
                        {
                            _logger.LogDebug($"{diagnostic.Id}: {diagnostic.GetMessage()}");
                        }
                    }

                    ms.Seek(0,SeekOrigin.Begin);
                    assemblyBytes = ms.ToArray();
                }

                return assemblyBytes;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex,"Could not compile");
                return null;
            }

这是堆栈跟踪:

at Microsoft.CodeAnalysis.Emit.EmitOptions.ValidateOptions(DiagnosticBag diagnostics,CommonMessageProvider messageProvider,Boolean isDeterministic)
at Microsoft.CodeAnalysis.Compilation.CheckOptionsAndCreateModuleBuilder(DiagnosticBag diagnostics,IEnumerable`1 manifestResources,EmitOptions options,IMethodSymbol debugEntryPoint,Stream sourceLinkStream,IEnumerable`1 embeddedTexts,CompilationTestData testData,CancellationToken cancellationToken)
at Microsoft.CodeAnalysis.Compilation.Emit(Stream pestream,Stream Metadatapestream,Stream pdbStream,Stream xmlDocumentationStream,Stream win32Resources,CancellationToken cancellationToken)```

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)