[IronPython] Hosting: Delegates from Ironpython to C#

Dino Viehland dinov at exchange.microsoft.com
Thu Aug 30 17:27:33 CEST 2007

I think you should be able to just pass a function object to PythonRegister and it should be converted into a delegate.  For example:

import clr
from PyAcadDotNet import PyAcadCmd

def foo():
        print 'hello world'

PyAcadCmd.PythonRegister('some command', foo, CommandFlags.Whatever)

Does that not work?

-----Original Message-----
From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of Tim Riley
Sent: Wednesday, August 29, 2007 7:10 PM
To: Discussion of IronPython
Subject: [IronPython] Hosting: Delegates from Ironpython to C#

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:

def test1:
    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 System.Runtime.InteropServices;
using Autodesk.AutoCAD.Runtime ;
using Autodesk.AutoCAD.EditorInput;

namespace PyAcadDotNet
        /// <summary>
        /// PyAcadCmd Class:
        /// Used to register commands on the AutoCAD command stack.
        /// </summary>
        public class PyAcadCmd
                public PyAcadCmd()
                public delegate void CmdDelegate();

                /// <summary>
                /// RegPyAcadCmd:
                /// Registers a delegate (callback) with the AutoCAD command string
                /// on the command stack.
                /// </summary>
                         CallingConvention=CallingConvention.Cdecl,CharSet = CharSet.Unicode,
                         EntryPoint = "?RegPyCmd@@YAXPB_W0HP6AXXZ at Z")]
                public static extern void RegPyCmd(
                        string cmd_group,
                        string cmd_name,
                        Autodesk.AutoCAD.Runtime.CommandFlags cmd_flags,
                        [MarshalAs(UnmanagedType.FunctionPtr)] PyAcadCmd.CmdDelegate cmd_delegate);

        public static void PythonRegister(string CommandName,
CmdDelegate FuncPointer, CommandFlags flags)
            RegPyCmd("_pycmds", CommandName, flags, FuncPointer);

        //testing stuff
        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);

Users mailing list
Users at lists.ironpython.com

More information about the Ironpython-users mailing list