使用Roslyn运行C#脚本时如何引用程序集
使用Roslyn的CSharpScript类运行C#脚本时,会默认包含一部分程序集,默认包含的程序集引用可以直接使用,而其他程序集则需要额外提供引用。本文简单描述了使用Roslyn的CSharpScript类实运行C#脚本时,如何引用程序集。
情景再现
首先创建一个C#类库,代码很简单,提供一个静态公共方法,打印一个字符串
namespace ClassLibrary1
{
public class Class1
{
public static void TestMethod()
{
Console.WriteLine("Class1:TestMethod");
}
}
}
然后在创建一个C#控制台,引用类库,然后分别通过普通方式和脚本化的方式调用TestMethod
using ClassLibrary1;
using Microsoft.CodeAnalysis.CSharp.Scripting;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Class1.TestMethod();
var code2 = @"Class1.TestMethod();";
try
{
CSharpScript.Create(code2).RunAsync().GetAwaiter().GetResult();
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
}
结果如下
Class1::TestMethod.Call directly
Microsoft.CodeAnalysis.Scripting.CompilationErrorException: (1,1): error CS0103: 当前上下文中不存在名称“Class1”
在 Microsoft.CodeAnalysis.Scripting.ScriptBuilder.ThrowIfAnyCompilationErrors(DiagnosticBag diagnostics, DiagnosticFormatter formatter) 位置 /_/src/Scripting/Core/ScriptBuilder.cs:行号 105
在 Microsoft.CodeAnalysis.Scripting.ScriptBuilder.CreateExecutor[T](ScriptCompiler compiler, Compilation compilation, Boolean emitDebugInformation, CancellationToken cancellationToken) 位置 /_/src/Scripting/Core/ScriptBuilder.cs:行号 93
在 Microsoft.CodeAnalysis.Scripting.Script`1.GetExecutor(CancellationToken cancellationToken) 位置 /_/src/Scripting/Core/Script.cs:行号 392
在 Microsoft.CodeAnalysis.Scripting.Script`1.RunAsync(Object globals, Func`2 catchException, CancellationToken cancellationToken) 位置 /_/src/Scripting/Core/Script.cs:行号 492
在 ConsoleApp1.Program.Main(String[] args) 位置 D:\Projects\CSharp Projects\WpfApp1\ConsoleApp1\Program.cs:行号 15
可以看到,CSharpScript找不到Class1,即使我们加上using ClassLibrary1;结果也是一样。
问题解决
要让CSharpScript能够找到我们的程序集,需要使用CSharpScript.Create方法的options参数传入一个ScriptOptions类型的对象,并且利用ScriptOptions的WithRefrences方法添加程序集引用。
修改后的代码如下:
using System.Reflection;
using ClassLibrary1;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
namespace ConsoleApp1
{
internal class Program
{
static void Main(string[] args)
{
Class1.TestMethod("Call directly");
var code2 = @"
using ClassLibrary1;
Class1.TestMethod(""Call with scripting"");
";
var assembly = Assembly.Load("ClassLibrary1");
//如果当前的AppDomain中没有加载过该程序集,则需要使用Assembly.LoadFrom来加载
//确保程序集的路径正确,以及相关的依赖项也在正确的位置
//var assembly = Assembly.LoadFrom("ClassLibrary1.dll");
var options = ScriptOptions.Default.WithReferences(assembly);
CSharpScript.Create(code2, options).RunAsync().GetAwaiter().GetResult();
}
}
}
WithReference方法也接受string类型和MetadataReference类型的参数,例如,上述代码对WithReference方法的调用也可以使用下面两种方式(两种方式都需要使用绝对路径)
var options = ScriptOptions.Default.WithReferences(@"C:\ClassLibrary1");
或
var metaRef = MetadataReference.CreateFromFile(@"C:\ClassLibrary1");
var options = ScriptOptions.Default.WithReferences(metaRef);
运行后的结果如下:
Class1::TestMethod.Call directly
Class1::TestMethod.Call with scripting
使用Roslyn运行C#脚本时如何引用程序集的更多相关文章
- 命令行运行Python脚本时传入参数的三种方式
原文链接:命令行运行Python脚本时传入参数的三种方式(原文的几处错误在此已纠正) 如果在运行python脚本时需要传入一些参数,例如gpus与batch_size,可以使用如下三种方式. pyth ...
- 运行python脚本时,报错InsecurePlatformWarning: A true SSLContext object is not available,解决方法
今天,要在新环境里运行一个python脚本,遇到下面的报错: /usr/lib/python2.7/site-packages/urllib3/util/ssl_.py:160: InsecurePl ...
- [经验总结] 在 windows 命令窗口中运行 python 脚本时提示 ModuleNotFoundError: No module named 'xxx'
先给出的代码和目录结构 获取CPU代码如下: # -*- coding:utf-8 -*- ''' Created on Sep 10, 2018 @author: ''' import sys im ...
- pycharm运行RF脚本时的环境搭建与配置
1.安装pycharm:2.file->setting,下载插件intellibot,重启pycharm:3.配置识别RF类型文件,filefile->editor->file ty ...
- 脚本调用脚本时.与bash的差别
在做项目时,发现脚本调用脚本时,会意外退出任务. 下面的脚本是父脚本: #!/bin/bash . ./data/child.sh echo 123sds echo "45gfdg" ...
- python 中 使用sys模块 获取运行脚本时在命令行输入的参数
在python项目的开发的过程中, 经常需要运行各种python脚本, 有时候还需要根据不同的使用情况输入不同的参数, 如果每次都去编辑一下脚本那就太麻烦,太耗费时间了, 这时就可以使用Python自 ...
- 安卓8.0真机运行appium1.4遇到的问题:运行自动化脚本,手机自动安装 settings.apk和unclock.apk,执行脚本时提示安装UnicodeIME-debug.apk失败,怎么关掉自动安装?
运行自动化脚本,手机自动安装 settings.apk和unclock.apk,执行脚本时提示安装UnicodeIME-debug.apk失败,怎么关掉自动安装? 这3个apk的目录分别是: D:\P ...
- 『动善时』JMeter基础 — 57、Linux系统中运行JMeter脚本
目录 1.Linux系统中安装Java环境 (1)解压Java安装包 (2)配置Java环境变量 (3)验证Java环境是否配置成功 2.Linux系统中安装JMeter (1)下载JMeter (2 ...
- Java中运行动态脚本
这里主要总结Java中集成Groovy的应用. Groovy可以与Java完美集成来扩展我们的应用,比如替代Java+jexl实现算式表达式计算或其它功能.在Ofbiz中也集成了Groovy来执行一些 ...
- [原创]LoadRunner 12.02 录制脚本时提示无Internet访问,如何解决?
在使用LoadRunner 12.02 进行录制脚本时提示无Internet访问,如下图: 翻译中文如下: 可以尝试以下方式解决:点击弹出框中的“Yes”即可. 若还是有问题,尝试以下方式: (1)L ...
随机推荐
- 【Node.js】npm配置国内镜像源
[服务器]npm配置国内镜像源 零.问题 配置Node.js的HTTPS的时候,下载不了 一.解决 这里使用的是淘宝的镜像: npm config set registry https://regis ...
- 掌握FastAPI与Pydantic的跨字段验证技巧
title: 掌握FastAPI与Pydantic的跨字段验证技巧 date: 2025/04/01 00:32:07 updated: 2025/04/01 00:32:07 author: cmd ...
- S7.Net与西门子PLC通讯——纯新手必看
前言 本文档适合从未接触过PLC的.NET开发程序员入门查看.(其实看完了之后,PLC开发也就那样) PLC通讯入门比较难,需要关注的细节比较多.一边学习一边举一反三多思考,一定要自己创建Demo跟 ...
- 探秘Transformer系列之(25)--- KV Cache优化之处理长文本序列
探秘Transformer系列之(25)--- KV Cache优化之处理长文本序列 目录 探秘Transformer系列之(25)--- KV Cache优化之处理长文本序列 0x00 概述 0x0 ...
- @Scheduled 定时任务自定义
简介 @Scheduled 定时任务自定义可以通过SchedulingConfigurer实现. SchedulingConfigurer 是 Spring Framework 中的一个接口,用于配置 ...
- MCP Server Java 开发框架的体验比较(spring ai mcp 和 solon ai mcp)
目前已知的两个 mcp-server java 应用开发框架(ID类的,封装后体验都比较简洁): spring-ai-mcp,支持 java17 或以上 solon-ai-mcp,支持 java8 或 ...
- 解决React Warning: Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, ... useEffect cleanup function.
在写react程序时遇到警告: Warning: Can't perform a React state update on an unmounted component. This is a no- ...
- [笔记]关于JavaScript定时器如何清除和重启
定时器的清除和重启方法: // var t=setInterval(fun1,500) //fun1是你的函数 var fun1=function(){ //写入你的函数; } clearInterv ...
- where 闭包查询
$map1[] = ["like_article.user_id", 'not in', function ($query) use ($user_id) { $query-> ...
- Nim 概念 Concept 对性能的影响
Nim 概念 Concept 对性能的影响 继上一篇文章<C# 泛型编译特性对性能的影响>后,我又研究了 Nim 语言相关的设计,由于 Nim 语言与 C# 语言有些差异,比如Nim 没有 ...