You'd need to decorate the string array parameter with a lot more information -- it's an ANSI string rather than a Unicode string, for instance, and there's another parameter that describes the length of the array. But I just looked at the code for clrtype.accepts, and it doesn't appear to support decorating the parameter types with additional attributes. If you can get at the TypeBuilder -- and I know this used to be possible -- then the easiest way to implement this is probably just to call TypeBuilder.DefinePInvokeMethod directly.
Is there a typo in the C# code? It looks like SizeParamIndex should be 1 and not 10. On Sat, Jun 5, 2010 at 10:57 PM, Ashley Abraham <[email protected]>wrote: > Hi, > I have the following C# code and I am trying to do the same > functionality in IronPython, any help is appreciated. > > I was trying to do the same functionality in IronPython using the > clrtype.py from the IronPython-2.6-Samples and I am able to connect to the > library and the function but I am having trouble passing array of strings. > With the current code it only passes the first letter and then it crashes. > > I am trying to call cwavec(int, int, char *) and it is a C function which > is part of the vniwave.dll and I am trying access it in IronPython. > > C# code: > > namespace PVWave > { > public class OPI > { > > [DllImport("C:\\datk_code\\VNI\\wave\\bin\\bin.i386nt\\vniwave.dll", > EntryPoint = "cwavec", > ExactSpelling = false, > CharSet = CharSet.Ansi, > SetLastError = true)] > public static extern unsafe int cwavec(Int32 action, Int32 nCmds, > [MarshalAs(UnmanagedType.LPArray, ArraySubType = > UnmanagedType.LPStr, SizeParamIndex = 10)] string[] cmds); > > } > } > > Here is my attempt in IronPython: > > import clrtype > import System > import sys > > class OPI(object): > "Description of Class" > > # Note that you could also the "ctypes" modules instead of pinvoke > declarations > __metaclass__ = clrtype.ClrClass > > sys.path.append("C:\\datk_code\\VNI\\wave\\bin\\bin.i386nt") > > from System.Runtime.InteropServices import DllImportAttribute, > PreserveSigAttribute > DllImport = clrtype.attribute(DllImportAttribute) > PreserveSig = clrtype.attribute(PreserveSigAttribute) > > > @staticmethod > @DllImport("vniwave.dll") > @PreserveSig() > @clrtype.accepts(System.Int32, System.Int32, > System.Array[System.String]) > @clrtype.returns() > def cwavec(action, nCommands, commands): raise RuntimeError("this > should not get called") > > def call_pinvoke_method_pvwave(): > print "Calling pinvoke pvwave methods:" > actionNum = 2 > nCommands = 1 > commands = System.Array[System.String](['PRINT, "Connected to PV-Wave > from IronPython"']) > print "cwavec(action, nCommands, commands):" > OPI.cwavec(actionNum, nCommands, commands) > > call_pinvoke_method_pvwave() > > Thanks > Ash > > _______________________________________________ > Users mailing list > [email protected] > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com > >
_______________________________________________ Users mailing list [email protected] http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
