如何从嵌入式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
相关产品推荐
相关产品推荐

