问题描述
我正在尝试使用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 (将#修改为@)