加载 Roslyn 编译器生成的程序集

2023-11-21

我正在使用 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"));并读取

我的模块是在 Assemblymanifest 中的。 (Ausnahme von HRESULT:0x80131018)

大致翻译为

模块中需要有程序集清单。

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


我偶然发现了这一点,尽管您有一个公认的答案,但我认为它总体上没有帮助。所以,我将把这个留给像我这样的未来搜索者。

代码的问题有两件事,您可以通过查看返回值来发现这一点

EmitResult result = compilation.Emit(file);

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

  1. 未找到主要方法
  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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

加载 Roslyn 编译器生成的程序集 的相关文章

随机推荐

  • 如何修复警告“CoreUI:RunTimeThemeRefForBundleIdentifierAndName()无法在标识符为'(null)'的捆绑包中找到Assets.car”?

    我正在尝试在 iOS 13 beta 上测试应用程序 当我点击欢迎屏幕上的按钮以转到另一个屏幕时 应用程序冻结然后终止 当我在 Xcode 11 中调试时 我在控制台中看到以下警告行 框架 CoreUI RunTimeThemeRefFor
  • Java 中的 AES-256-CBC

    我正在尝试编写一个简单的 Java 程序 该程序将使用以下命令加密纯文本AES 256 CBC 有类 import javax crypto Cipher import javax crypto spec IvParameterSpec i
  • 第一个带有类的元素的 CSS 选择器

    我有一堆带有类名的元素red 但我似乎无法选择第一个元素class red 使用以下 CSS 规则 home red first child border 1px solid red div class home span blah spa
  • 新的 Apple 登录不断抛出错误 HTTP 400 Invalid_grant

    据苹果公司称doc为了验证 Apple 的授权码 我们需要 POST 到http appleid apple com auth token使用这个参数 java token generateJWT keyId teamId clientId
  • 仅使用 CSS 是否可以保持垂直节奏?

    我正在开发一个面向排版的 WordPress 主题 但我在使用内联图像时遇到了麻烦 我可以控制每个元素并调整其行高 下边距等 以保持垂直节奏 但由于通过编辑器粘贴的图像可以具有任意高度 因此它们显然会破坏以下所有内容 是否可以使用边距 填充
  • 在 Java 中使用 GroupLayout 构建 GUI

    我需要使用 GroupLayout 而不是其他布局 构建 GUI GUI 将如下所示 field 1 field 2 field 3 FFIEEELLLDD4 FIELDDDDDD5 FIEEEEEEEEEEEEEEELDDDD 6 字段
  • 停止 webbrowser C# 控件中的警报 javascript 弹出窗口

    这个网站 有这个代码 所以我的网络浏览器控件显示一个弹出窗口 如何在不使用 sendkeys Enter 的情况下绕过弹出窗口 如果您打算永远不使用alert 函数在您的页面上 您也可以覆盖它 例如 如果你确实需要使用 JavaScript
  • 使用 Powershell 调用 Rest API - CosmosDb

    我试图使用 Cosmos DB REST Api 部署 Cosmos 数据库 我正在使用一个函数来构建授权标头 我从以下位置获取了脚本https gallery technet microsoft com scriptcenter How
  • Python,网络驱动程序错误(Selenium)

    import time from selenium import webdriver from selenium webdriver common action chains import ActionChains from seleniu
  • 从 double 中获取小数部分

    我想以整数的形式接收小数点后的数字 例如 从 1 05 开始仅 05 或从 2 50 开始仅 50not 0 50 最好的方法是 var floatNumber 12 5523 var x floatNumber Math Truncate
  • PHP 中的初级数据缓存

    我正在使用 simpleXML 来浏览 Twitter XML 文件的 XML 结果 但我完全不知道如何使用 PHP 缓存结果 本文似乎有一些帮助 但我也遇到过memcache 和memcached 来吧 命名者 我不知道该怎么做 我正在使
  • Pyinstaller 和 Pandas 的导入错误

    我正在尝试将一个简短的 python 脚本捆绑到一个可执行文件中 我能够使用成功运行 pyinstaller pyinstaller script py 但是 当我运行可执行文件时 出现以下错误 我已经尝试了一切 但似乎没有任何效果 C U
  • 错误:在 R 中找不到函数...

    这是一个常见问题解答问题 因此请尽可能完整 答案是社区答案 因此如果您认为缺少某些内容 请随时进行编辑 这个问题在meta上进行了讨论和批准 我正在使用 R 并尝试过some function但我收到以下错误消息 Error could n
  • 公布的磁盘空间与实际磁盘空间[关闭]

    Closed 这个问题是无关 目前不接受答案 为什么广告的磁盘空间几乎总是高于 UI 报告的磁盘空间 例如 我有一个 80 GB 硬盘 但 iTunes UI 仅显示 74 我通常也会在硬盘和驱动器盘符中报告的数量上看到这种情况 您实际可以
  • Bootstrap:固定流体布局中的装订线宽度?

    我想要不同的布局 例如 left content right 和 left content 或 content right 当使用流体布局时 单元格 之间的装订线也是流体的并且具有百分比值 但我希望左 右和内容区域之间的装订线有一个固定的宽
  • 为什么 Oracle 的 varchar 排序顺序与 varchar 比较的行为不匹配?

    一条 SQL 语句如 select from select 000000000000 as x from dual union select 978123456789 as x from dual union select B002AACD
  • Spring 5 - 如何提供静态资源

    我正在尝试在我的网络应用程序中提供静态资源 并且我尝试过 SuppressWarnings deprecation Bean WebMvcConfigurerAdapter configurer return new WebMvcConfi
  • 当 PHP 动态创建 HTTP 响应时缓存它们

    我认为我的问题看起来很随意 但请耐心等待 因为它会变得有趣 至少对我来说 考虑一个 PHP 页面 其目的是从文件系统读取请求的文件并将其作为响应进行回显 现在的问题是如何启用该页面的缓存 需要指出的是 文件可能非常大 启用缓存是为了避免客户
  • .NET Core 2.0 基本路径错误

    刚刚启动了一个新的 NET Core 2 0 应用程序 但突然出现奇怪的行为 似乎找不到任何东西 点击时会弹出如下错误 Run of my BuildWebHost System InvalidOperationException A pa
  • 加载 Roslyn 编译器生成的程序集

    我正在使用 Roslyn 编译器生成 Greeter dll 我在尝试加载 DLL 文件时出现问题 这是代码 using System using Roslyn Compilers using Roslyn Compilers CSharp