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

如何从运行时编译的用户代码访问FormLog的AddText方法?

解决动态编译代码访问FormLog.AddText的问题

给你几个适配现有架构的解决办法:

方法1:让动态编译代码引用包含FormLog的程序集

用户代码编译时找不到FormLog类型,本质是没引用它所在的程序集。编译用户代码时,把主程序集(或FormLog所在的类库)加入引用列表:

// 编译用户代码时的参数设置
var compilerParams = new CompilerParameters();
// 添加主程序集引用(假设FormLog在当前程序集内)
compilerParams.ReferencedAssemblies.Add(typeof(FormLog).Assembly.Location);
// 必须添加WinForms基础引用
compilerParams.ReferencedAssemblies.Add("System.Windows.Forms.dll");
compilerParams.GenerateInMemory = true;

// 执行编译
var provider = new CSharpCodeProvider();
var compileResult = provider.CompileAssemblyFromFile(compilerParams, "用户代码文件路径");

之后用户代码里只需引入FormLog的命名空间,就能用你原有的写法:

using YourNamespace; // 替换为FormLog实际所在的命名空间

// ...
var logForm = Application.OpenForms["FormLog"] as FormLog;
logForm?.AddText("日志内容");

方法2:用反射绕过类型依赖

不想添加程序集引用的话,直接用反射调用方法,无需强制转换类型:

用户代码里这么写:

foreach (Form item in Application.OpenForms)
{
    if (item.Name == "FormLog")
    {
        // 通过反射获取并调用AddText方法
        var addTextMethod = item.GetType().GetMethod("AddText", new[] { typeof(string) });
        addTextMethod?.Invoke(item, new object[] { "日志内容" });
        break;
    }
}

这种方式不需要用户代码知晓FormLog具体类型,只要确认方法名和参数匹配即可,缺点是没有编译时校验,写错方法名或参数会触发运行时错误。

方法3:定义公共接口(更规范的实现)

如果想兼顾类型安全和低耦合,可以定义一个公共接口,让FormLog实现它:

  1. 先定义接口(放在主程序集或单独类库中):
public interface ILogWriter
{
    void AddText(string text);
}
  1. 让FormLog实现该接口:
public class FormLog : Form, ILogWriter
{
    // 原有AddText实现
    public void AddText(string text)
    {
        // 你的日志写入逻辑
    }
}
  1. 编译用户代码时引用包含ILogWriter的程序集,用户代码里就可以这么写:
using YourNamespace; // 替换为ILogWriter所在的命名空间

// ...
foreach (Form item in Application.OpenForms)
{
    if (item is ILogWriter logWriter)
    {
        logWriter.AddText("日志内容");
        break;
    }
}

这种方式比直接依赖FormLog类型更灵活,即便后续更换日志窗口实现,只要接口不变,用户代码无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:35:23