gpt4 book ai didi

c# - 加载由 Roslyn 编译器生成的程序集

转载 作者:太空狗 更新时间:2023-10-29 20:01:38 28 4
gpt4 key购买 nike

我正在使用 Roslyn 编译器生成 Greeter.dll。我在尝试加载 DLL 文件时出现问题。

代码如下:

using System;

using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;

using System.IO;
using System.Reflection;
using System.Linq;

namespace LoadingAClass
{
class Program
{
static void Main(string[] args)
{
var syntaxTree = SyntaxTree.ParseCompilationUnit(@"
class Greeter
{
static void Greet()
{
Console.WriteLine(""Hello, World"");
}
}");

var compilation = Compilation.Create("Greeter.dll",
syntaxTrees: new[] { syntaxTree },
references: new[] {
new AssemblyFileReference(typeof(object).Assembly.Location),
new AssemblyFileReference(typeof(Enumerable).Assembly.Location),
});

Assembly assembly;
using (var file = new FileStream("Greeter.dll", FileMode.Create))
{
EmitResult result = compilation.Emit(file);
}

assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), @"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();

}
}
// Thanks, http://blogs.msdn.com/b/csharpfaq/archive/2011/11/23/using-the-roslyn-symbol-api.aspx
}

错误消息出现在 assembly = Assembly.LoadFile(Path.Combine(Directory.GetCurrentDirectory(), @"Greeter.dll")); 行上并读取

Im Modul wurde ein Assemblymanifest erwartet. (Ausnahme von HRESULT: 0x80131018)

大致翻译成

An assembly manifest was expected in the module.

有人知道我在这里缺少什么吗?

最佳答案

我偶然发现了这个,即使您有一个可接受的答案,我也不认为它通常有帮助。所以,我将把它留在这里供像我这样的 future 搜索者使用。

代码的问题有两点,您可以通过查看

的返回值来发现
EmitResult result = compilation.Emit(file);

如果您查看 EmitResult 对象的属性,您会发现 results.Diagnostics 成员中有 2 个错误。

  1. 未找到主要方法
  2. 找不到类控制台

所以,要解决这个问题,1.您需要将输出标记为dll2.您需要添加“使用系统;”到您传递给 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();

关于c# - 加载由 Roslyn 编译器生成的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10751079/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com