[Python.NET] Problem with System.ArgumentException in call to method from dll

Tribble, Brett btribble at ea.com
Wed Jan 23 19:51:48 CET 2013


My personal solution would be to wrap the camera code in a very thin assembly that manages this stuff and provides a clean interface for python.net to hook into. I'm lazy that way though...

From: PythonDotNet [mailto:pythondotnet-bounces+btribble=ea.com at python.org] On Behalf Of Daniel Krause
Sent: Tuesday, January 22, 2013 10:08 PM
To: pythondotnet at python.org
Subject: Re: [Python.NET] Problem with System.ArgumentException in call to method from dll

@Brett

When I try

bitmapsrc = BitmapSource()

I get the following error:

Traceback (most recent call last):
  File "C:\Users\mdk\workspace\\camera\testbitmap.py", line 8, in <module>
    bitmapsrc = BitmapSource()
TypeError: cannot instantiate abstract class

I will have a look at System.Reflection, thanks for the hint.

@Brad
The documentation does not say anything about "safe" or "unsafe". I do not have the source for the dll, only for the examples shipped with the dll. If you would like to have a look at them, I could send them to you.


Daniel

2013/1/23 brad at fie.us<mailto:brad at fie.us> <brad at fie.us<mailto:brad at fie.us>>
Just to clarify: neither version of the methods you are calling are marked "unsafe" in the proper c# .net manner are they?  I would not be surprised to find PythonNet not providing access to "unsafe" methods.  I would need to take a trip through the source to verify.

On Jan 22, 2013, at 4:10 PM, Daniel Krause <m.daniel.krause at googlemail.com<mailto:m.daniel.krause at googlemail.com>> wrote:


That is right, I want to get the value of the output parameter.

The following variant looks much more logical to me, but than I get another error:
bitmapsrc = cam.GetImage(timeout)
TypeError: No method matches given arguments

So it seems that I have to pass the "out"-parameter to the method as well, but that was not working either.


2013/1/22 brad at fie.us<mailto:brad at fie.us> <brad at fie.us<mailto:brad at fie.us>>
You are setting the bitmapsrc variable to be equal to the class BitmapSource.  I assume you mean to get the value of an output parameter, rather than pass a class object into the method.

Though I do not speak german.  But I think that's it.

On Jan 22, 2013, at 2:58 PM, Daniel Krause <m.daniel.krause at googlemail.com<mailto:m.daniel.krause at googlemail.com>> wrote:

> I want to use a method from an API to control a camera (xiApi.NETX64.dll).
>
> The method is described in two ways:
> //
> void GetImage( out WriteableBitmap image, int timeout)
> Description : This function acquires image and returns fills WritableBitmap object. Supports UNSAFE buffer policy mode.
> Parameters :
> out WriteableBitmap image : WPF BitmapSource to be filled.
> int timeout : Time interval required to wait for the image (in milliseconds).
> //
> void GetImage(WriteableBitmap image, int timeout)
> Description : This function acquires image and returns fills WritableBitmap object. Supports SAFE buffer policy mode.
> Parameters :
> WriteableBitmap image : WPF BitmapSource to be filled.
> int timeout : Time interval required to wait for the image (in milliseconds).
> //
>
> The code in a c#-sample looks like this (I skipped the initialisation of myCam, but if it helps I can provide the complete code):
> //
> using System.Windows.Media.Imaging;
> int timeout = 10000;
> BitmapSource myBitmapSrc;
> myCam.GetImage(out myBitmapSrc, timeout);
> //
> This code I can compile, and it is working.
>
> I tried to keep the python code as close as possible, but I get errors I do not understand:
> ##
> import clr
> import sys
> sys.path.append("C:\\Windows\\Microsoft.NET\\Framework64\\v4.0.30319\\WPF")
> clr.AddReference("PresentationCore")
> clr.AddReference("xiAPI.NETX64")
> from xiApi.NET<http://xiApi.NET> import *
> from System.Windows.Media.Imaging import BitmapSource
> bitmapsrc = BitmapSource
> print bitmapsrc
> cam = xiCam()
> cam.OpenDevice(0)
> cam.SetParam(PRM.BUFFER_POLICY, BUFF_POLICY.SAFE)
> cam.SetParam(PRM.IMAGE_DATA_FORMAT,  IMG_FORMAT.MONO8)
> cam.StartAcquisition()
> timeout = 1000
> bitmapsrc = cam.GetImage(bitmapsrc, timeout)
> cam.StopAcquisition()
> ##
>
> Console output:
> <class 'System.Windows.Media.Imaging.BitmapSource'>
> Traceback (most recent call last):
>   File "C:\Users\mdk\workspace\camera\testbitmap.py",
> line 17, in <module>
>     bitmapsrc = cam.GetImage(bitmapsrc, timeout)
> System.ArgumentException: Das Objekt mit dem Typ "System.RuntimeType" kann nicht
>  in den Typ "System.Drawing.Bitmap&" konvertiert werden.
>    bei System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo
>  culture, Boolean needsSpecialCast)
>
>    bei System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder b
> inder, BindingFlags invokeAttr, CultureInfo culture, Signature sig)
>
>    bei System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj, Bind
> ingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
>
>    bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invok
> eAttr, Binder binder, Object[] parameters, CultureInfo culture)
>
>    bei Python.Runtime.MethodBinder.Invoke(IntPtr inst, IntPtr args, IntPtr kw, M
> ethodBase info, MethodInfo[] methodinfo)
> _________________________________________________
> Python.NET<http://Python.NET> mailing list - PythonDotNet at python.org<mailto:PythonDotNet at python.org>
> http://mail.python.org/mailman/listinfo/pythondotnet

_________________________________________________
Python.NET<http://Python.NET> mailing list - PythonDotNet at python.org<mailto:PythonDotNet at python.org>
http://mail.python.org/mailman/listinfo/pythondotnet


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pythondotnet/attachments/20130123/2d83fe1c/attachment-0001.html>


More information about the PythonDotNet mailing list