You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# 使用Roslyn(Microsoft.CodeAnalysis.CSharp.Scripting)如何调用主程序依赖

主程序依赖在Roslyn C#脚本中可用的实现方案

要让custom.cs脚本可以正常调用主exe的内部依赖,需要在Roslyn脚本初始化阶段显式配置程序集引用、访问权限,具体操作如下:

  • 第一步:添加主程序及依赖的程序集引用
    Roslyn脚本运行时默认不会自动继承宿主程序的引用链,你需要手动把主程序本身、以及主程序所有依赖的程序集加到脚本配置中,示例代码如下:
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;
using System.Reflection;

// 收集所有需要暴露给脚本的程序集
var refAssemblies = new List<Assembly>();
// 加入主exe自身的程序集
var hostAssembly = Assembly.GetExecutingAssembly();
refAssemblies.Add(hostAssembly);
// 加入主exe引用的所有依赖程序集
foreach (var refName in hostAssembly.GetReferencedAssemblies())
{
    refAssemblies.Add(Assembly.Load(refName));
}

// 构建脚本配置
var scriptOpts = ScriptOptions.Default
    .AddReferences(refAssemblies)
    // 按需导入公共命名空间,脚本内无需重复写using
    .AddImports("System", "System.Collections.Generic", "你的主程序根命名空间", "其他需要开放的命名空间");

// 执行脚本
var customScriptCode = File.ReadAllText("custom.cs");
var runResult = await CSharpScript.EvaluateAsync(customScriptCode, scriptOpts);
  • 第二步:处理内部成员访问权限
    如果你需要脚本访问主程序中internal修饰的类、方法、属性,不需要强制改成public,可以在主项目的AssemblyInfo.cs文件中添加友元程序集声明:
[assembly: InternalsVisibleTo("RoslynScript*")]

Roslyn动态生成的脚本程序集名称默认以RoslynScript为前缀,通配符配置可以匹配所有动态生成的脚本程序集,赋予其访问主程序内部成员的权限。

  • 第三步:特殊场景兼容处理
    • 如果主程序包含非托管dll、运行时动态加载的程序集,需要提前把这些文件的路径加入程序集探测路径,或者通过AppDomain.CurrentDomain.AssemblyResolve事件手动处理脚本运行时的程序集加载请求。
    • 如果你需要把主程序的运行时实例传递给脚本调用,可以使用带全局参数的脚本执行重载:CSharpScript.EvaluateAsync(customScriptCode, scriptOpts, globals: 你的宿主实例),脚本内可以直接访问该实例的所有公开成员。

内容的提问来源于stack exchange,提问作者Exodus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:09:05