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: 你的宿主实例),脚本内可以直接访问该实例的所有公开成员。
- 如果主程序包含非托管dll、运行时动态加载的程序集,需要提前把这些文件的路径加入程序集探测路径,或者通过
内容的提问来源于stack exchange,提问作者Exodus
相关产品推荐
相关产品推荐

