[IronPython] Hosting: Delegates from Ironpython to C#
riltim at gmail.com
Thu Aug 30 04:09:40 CEST 2007
I'm embedding IronPython in a C# dll that is hosted inside a program
called AutoCAD. In order to register commands in AutoCAD from .NET I
need to P/Invoke a C function inside a .dll. I can do this fairly easy
from C# but I can't figure out the right way to call my C# wrapper
from IronPython to have it register the command. I have perused the
hosting docs for 1.1 and haven't been able to come up with a solution
that works. Here is my C# code. I either want to call the PyRegCmds
void or the PythonRegister void. Both of which expect a delegate.for
example if I had a python function like:
print "This is a test".
I can't figure out how to map test to the delegate required in the code below.
Note: I can call this from C# fine. See :static public void test().
Can anyone give me any pointers? It would be greatly appreciated.
using System ;
using Autodesk.AutoCAD.Runtime ;
/// PyAcadCmd Class:
/// Used to register commands on the AutoCAD command stack.
public class PyAcadCmd
public delegate void CmdDelegate();
/// Registers a delegate (callback) with the AutoCAD command string
/// on the command stack.
CallingConvention=CallingConvention.Cdecl,CharSet = CharSet.Unicode,
EntryPoint = "?RegPyCmd@@YAXPB_W0HP6AXXZ at Z")]
public static extern void RegPyCmd(
[MarshalAs(UnmanagedType.FunctionPtr)] PyAcadCmd.CmdDelegate cmd_delegate);
public static void PythonRegister(string CommandName,
CmdDelegate FuncPointer, CommandFlags flags)
RegPyCmd("_pycmds", CommandName, flags, FuncPointer);
public static void testcommand()
Editor ed =
ed.WriteMessage("\ncb1 delegate seems to work!\n");
static public void test() // This method can have any name
CmdDelegate cb1 = new CmdDelegate(PyAcadCmd.testcommand);
PythonRegister("testcommand", cb1, CommandFlags.Session);
More information about the Ironpython-users