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

如何从嵌入式IronPython脚本访问C#类的方法?

在嵌入式IronPython中访问C#类方法的实现方案

首先明确告诉你:完全可以!你已经在代码里走对了关键一步——把C#的实例注入到IronPython的ScriptScope中,剩下的就是在Python脚本里直接调用它的方法就行。先把你的C#代码补全,再给对应的Python示例,顺便讲几个关键注意点。

补全后的C#代码示例

首先你的C#类需要是public的,并且包含可访问的方法(比如实例方法、静态方法),这样IronPython才能正确访问:

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            TestClass t = new TestClass(); // 这里把类名改成TestClass避免和命名空间重名,你也可以保留原名称
            ScriptEngine engine = Python.CreateEngine();
            ScriptScope scope = engine.CreateScope();
            scope.SetVariable("csharp_test_obj", t); // 给Python里的变量起个清晰的名字
            // 同时注入类类型,方便调用静态方法
            scope.SetVariable("TestClass", typeof(TestClass));
            engine.ExecuteFile("test.py", scope);
            Console.WriteLine("-------------------->");
            Console.Read();
        }
    }

    // 必须是public类,方法/属性也要public才能被IronPython访问
    public class TestClass
    {
        // 实例方法
        public string Greet(string name)
        {
            return $"Hello {name} from C#!";
        }

        // 静态方法
        public static int Add(int a, int b)
        {
            return a + b;
        }

        // 公共属性
        public string Message { get; set; } = "Default message from C#";
    }
}

对应的Python脚本(test.py)

在Python里,你可以直接使用注入的变量调用C#的方法、访问属性,和调用Python对象几乎没区别:

# 调用C#实例方法
greeting = csharp_test_obj.Greet("IronPython")
print(greeting)  # 输出: Hello IronPython from C#!

# 访问并修改C#类的属性
print("Original C# message:", csharp_test_obj.Message)
csharp_test_obj.Message = "Updated from Python!"
print("Updated C# message:", csharp_test_obj.Message)

# 调用C#静态方法
sum_result = TestClass.Add(10, 20)
print("10 + 20 =", sum_result)  # 输出: 10 + 20 = 30

关键注意事项

  • 可见性要求:C#的类、方法、属性必须是public的,IronPython无法访问非公开的成员(除非用反射,但一般没必要)。
  • 类型自动转换:IronPython会自动处理C#和Python的基础类型转换(比如int、string、Python列表和C#List<T>之间的转换),复杂类型也可以直接传递和访问。
  • 泛型方法调用:如果需要调用C#的泛型方法,可以用obj.MethodName[Type](params)的语法,比如list_obj.Add[int](5)。
  • 事件绑定:如果C#类有事件,还能在Python里绑定回调函数,比如csharp_test_obj.MyEvent += lambda sender, e: print("Event triggered!")。

你之前提到“仅找到从程序集调用的方式”,其实你现在的嵌入式方式本质上就是在当前程序集内访问,只要把实例或类型注入到ScriptScope,Python就能直接使用,不需要额外加载程序集(如果是外部程序集,用engine.Runtime.LoadAssembly加载后即可使用)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:49:21