在运行时编译期间收到 "You must add a reference to assembly 'netstandard'" 个错误
Receiving "You must add a reference to assembly 'netstandard'" Errors during Runtime Compilation
使用 C# 运行时编译 (Roslyn),我收到许多错误,指出尽管在netcoreapp.
的上下文
出现以下格式的错误:
The type 'XXX' is defined in an assembly that is not referenced.
You must add a reference to assembly 'netstandard, Version=2.0.0.0...
由此产生的代码处理可以提炼成以下片段:
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Compiler
{
public static class Compiler
{
public static Assembly CompileAssembly(string code, bool compileAsExecutable = false)
{
var outputKind = compileAsExecutable ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary;
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxTrees = new[] {syntaxTree};
var systemAssemblyReference = GetMetadataReference<object>();
var patchBandAssemblyReference = GetMetadataReference<AssemblyTargetedPatchBandAttribute>();
var references = new[] {systemAssemblyReference, patchBandAssemblyReference};
var cSharpCompilationOptions = new CSharpCompilationOptions(outputKind);
var compilation = CSharpCompilation.Create(@"Countdown", syntaxTrees, references, cSharpCompilationOptions);
using (var assemblyStream = new MemoryStream())
{
var emitResult = compilation.Emit(assemblyStream);
if (emitResult.Success)
{
var assemblyBytes = assemblyStream.ToArray();
return Assembly.Load(assemblyBytes);
}
var errors = emitResult
.Diagnostics
.Select(diagnostic => diagnostic.GetMessage())
.Select(message => new Exception(message));
throw new AggregateException(errors);
}
}
private static string GetAssemblyLocation<T>()
{
var typeOfT = typeof(T);
return typeOfT.Assembly.Location;
}
private static PortableExecutableReference GetMetadataReference<T>()
{
var assemblyLocation = GetAssemblyLocation<T>();
return MetadataReference.CreateFromFile(assemblyLocation);
}
}
}
解决方案是添加对 netstandard.dll:
的引用
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Compiler
{
public static class Compiler
{
public static Assembly CompileAssembly(string code, bool compileAsExecutable = false)
{
var outputKind = compileAsExecutable ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary;
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxTrees = new[] {syntaxTree};
// Requested the reference be fetched
var runtimeSpecificReference = GetRuntimeSpecificReference();
var systemAssemblyReference = GetMetadataReference<object>();
var patchBandAssemblyReference = GetMetadataReference<AssemblyTargetedPatchBandAttribute>();
// Added the reference to the value here
var references = new[] {runtimeSpecificReference, systemAssemblyReference, patchBandAssemblyReference};
var cSharpCompilationOptions = new CSharpCompilationOptions(outputKind);
var compilation = CSharpCompilation.Create(@"Countdown", syntaxTrees, references, cSharpCompilationOptions);
using (var assemblyStream = new MemoryStream())
{
var emitResult = compilation.Emit(assemblyStream);
if (emitResult.Success)
{
var assemblyBytes = assemblyStream.ToArray();
return Assembly.Load(assemblyBytes);
}
var errors = emitResult
.Diagnostics
.Select(diagnostic => diagnostic.GetMessage())
.Select(message => new Exception(message));
throw new AggregateException(errors);
}
}
private static string GetAssemblyLocation<T>()
{
var typeOfT = typeof(T);
return typeOfT.Assembly.Location;
}
private static PortableExecutableReference GetMetadataReference<T>()
{
var assemblyLocation = GetAssemblyLocation<T>();
return MetadataReference.CreateFromFile(assemblyLocation);
}
// This function was needed
private static PortableExecutableReference GetRuntimeSpecificReference()
{
var assemblyLocation = GetAssemblyLocation<object>();
var runtimeDirectory = Path.GetDirectoryName(assemblyLocation);
var libraryPath = Path.Join(runtimeDirectory, @"netstandard.dll");
return MetadataReference.CreateFromFile(libraryPath);
}
}
}
使用 C# 运行时编译 (Roslyn),我收到许多错误,指出尽管在netcoreapp.
的上下文出现以下格式的错误:
The type 'XXX' is defined in an assembly that is not referenced. You must add a reference to assembly 'netstandard, Version=2.0.0.0...
由此产生的代码处理可以提炼成以下片段:
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Compiler
{
public static class Compiler
{
public static Assembly CompileAssembly(string code, bool compileAsExecutable = false)
{
var outputKind = compileAsExecutable ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary;
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxTrees = new[] {syntaxTree};
var systemAssemblyReference = GetMetadataReference<object>();
var patchBandAssemblyReference = GetMetadataReference<AssemblyTargetedPatchBandAttribute>();
var references = new[] {systemAssemblyReference, patchBandAssemblyReference};
var cSharpCompilationOptions = new CSharpCompilationOptions(outputKind);
var compilation = CSharpCompilation.Create(@"Countdown", syntaxTrees, references, cSharpCompilationOptions);
using (var assemblyStream = new MemoryStream())
{
var emitResult = compilation.Emit(assemblyStream);
if (emitResult.Success)
{
var assemblyBytes = assemblyStream.ToArray();
return Assembly.Load(assemblyBytes);
}
var errors = emitResult
.Diagnostics
.Select(diagnostic => diagnostic.GetMessage())
.Select(message => new Exception(message));
throw new AggregateException(errors);
}
}
private static string GetAssemblyLocation<T>()
{
var typeOfT = typeof(T);
return typeOfT.Assembly.Location;
}
private static PortableExecutableReference GetMetadataReference<T>()
{
var assemblyLocation = GetAssemblyLocation<T>();
return MetadataReference.CreateFromFile(assemblyLocation);
}
}
}
解决方案是添加对 netstandard.dll:
的引用using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
namespace Compiler
{
public static class Compiler
{
public static Assembly CompileAssembly(string code, bool compileAsExecutable = false)
{
var outputKind = compileAsExecutable ? OutputKind.ConsoleApplication : OutputKind.DynamicallyLinkedLibrary;
var syntaxTree = CSharpSyntaxTree.ParseText(code);
var syntaxTrees = new[] {syntaxTree};
// Requested the reference be fetched
var runtimeSpecificReference = GetRuntimeSpecificReference();
var systemAssemblyReference = GetMetadataReference<object>();
var patchBandAssemblyReference = GetMetadataReference<AssemblyTargetedPatchBandAttribute>();
// Added the reference to the value here
var references = new[] {runtimeSpecificReference, systemAssemblyReference, patchBandAssemblyReference};
var cSharpCompilationOptions = new CSharpCompilationOptions(outputKind);
var compilation = CSharpCompilation.Create(@"Countdown", syntaxTrees, references, cSharpCompilationOptions);
using (var assemblyStream = new MemoryStream())
{
var emitResult = compilation.Emit(assemblyStream);
if (emitResult.Success)
{
var assemblyBytes = assemblyStream.ToArray();
return Assembly.Load(assemblyBytes);
}
var errors = emitResult
.Diagnostics
.Select(diagnostic => diagnostic.GetMessage())
.Select(message => new Exception(message));
throw new AggregateException(errors);
}
}
private static string GetAssemblyLocation<T>()
{
var typeOfT = typeof(T);
return typeOfT.Assembly.Location;
}
private static PortableExecutableReference GetMetadataReference<T>()
{
var assemblyLocation = GetAssemblyLocation<T>();
return MetadataReference.CreateFromFile(assemblyLocation);
}
// This function was needed
private static PortableExecutableReference GetRuntimeSpecificReference()
{
var assemblyLocation = GetAssemblyLocation<object>();
var runtimeDirectory = Path.GetDirectoryName(assemblyLocation);
var libraryPath = Path.Join(runtimeDirectory, @"netstandard.dll");
return MetadataReference.CreateFromFile(libraryPath);
}
}
}