我偶然发现了这一点,尽管您有一个公认的答案,但我认为它总体上没有帮助。所以,我将把这个留给像我这样的未来搜索者。
代码的问题有两件事,您可以通过查看返回值来发现这一点
EmitResult result = compilation.Emit(file);
如果查看 EmitResult 对象的属性,您会发现 results.Diagnostics 成员中有 2 个错误。
- 未找到主要方法
- 找不到类控制台
所以,为了解决这个问题,
1.需要将输出标记为dll
2.您需要添加“使用系统;”传递到 API 的代码或说“System.Console.WriteLine”
以下代码可以进行更改以解决这两个问题:
var outputFile = "Greeter.dll";
var syntaxTree = SyntaxTree.ParseCompilationUnit(@"
// ADDED THE FOLLOWING LINE
using System;
class Greeter
{
public void Greet()
{
Console.WriteLine(""Hello, World"");
}
}");
var compilation = Compilation.Create(outputFile,
syntaxTrees: new[] { syntaxTree },
references: new[] {
new AssemblyFileReference(typeof(object).Assembly.Location),
new AssemblyFileReference(typeof(Enumerable).Assembly.Location),
},
// ADDED THE FOLLOWING LINE
options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary));
using (var file = new FileStream(outputFile, FileMode.Create))
{
EmitResult result = compilation.Emit(file);
}
Assembly assembly = Assembly.LoadFrom("Greeter.dll");
Type type = assembly.GetType("Greeter");
var obj = Activator.CreateInstance(type);
type.InvokeMember("Greet",
BindingFlags.Default | BindingFlags.InvokeMethod,
null,
obj,
null);
Console.WriteLine("<ENTER> to continue");
Console.ReadLine();