[IronPython] how to convert C# MarshalAs code to IronPython
Ashley Abraham
abrahams84 at gmail.com
Sun Jun 6 21:15:17 CEST 2010
Is it a good approach to use clrtype.py or is there a better way to call the
C function from IronPython...
Also, the SizeParamIndex works ok when it is set to 10 in VS2005, but it
does error out when used in VS2010, then I set it to 1.
Thanks
Ashley
On Sun, Jun 6, 2010 at 9:48 AM, Curt Hagenlocher <curt at hagenlocher.org>wrote:
> 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 <abrahams84 at gmail.com>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
>> Users at lists.ironpython.com
>> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>>
>>
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20100606/b9067691/attachment.html>
More information about the Ironpython-users
mailing list