2011-03-17 3 views
2

J'essaie de faire une pinping une fonction C à partir de IronPython 2.6 sur Ubuntu 10.10. J'ai utilisé un exemple de la distribution IP comme modèle. Toutefois, le code C renvoie "StandardError: Exception a été levée par la cible d'une invocation."Comment Pinping IronPython sur Linux

J'ai essayé plusieurs approches, mais aucune ne fonctionne. Voici mon code:

pinvoke_test.h

extern void pinvoke_this(const char*); 

pinvoke_test.c

#include <stdio.h> 
#include "pinvoke_test.h" 

void pinvoke_this(const char *b) 
{ 
    FILE *file; 
    file = fopen("file.txt","w+"); 
    fprintf(file,"%s", b); 
    fclose(file); 
} 

pinvoke_test.py

import clr 
import clrtype 
import System 

class NativeMethods(object): 

    __metaclass__ = clrtype.ClrClass 

    from System.Runtime.InteropServices import DllImportAttribute, PreserveSigAttribute 
    DllImport = clrtype.attribute(DllImportAttribute) 
    PreserveSig = clrtype.attribute(PreserveSigAttribute) 

    @staticmethod 
    @DllImport("pinvoke_test.o") 
    @PreserveSig() 
    @clrtype.accepts(System.Char) 
    @clrtype.returns(System.Void) 
    def pinvoke_this(c): raise RuntimeError("this should not get called") 


def call_pinvoke_method(): 
    args = System.Array[object](("sample".Chars[0],)) 
    pinvoke_this = clr.GetClrType(NativeMethods).GetMethod('pinvoke_this') 
    pinvoke_this.Invoke(None, args) 

call_pinvoke_method() 

Le fichier objet est compilé par « gcc -c pinvoke_test. c -o pinvoke_test.o ". J'espère que quelqu'un peut me diriger dans la bonne direction.

+0

Je suggère d'obtenir la trace complète de la pile en utilisant -X: ExceptionDetail lors de l'exécution de ipy.exe. Le simple fait de connaître le texte d'exception n'est pas très utile. Vous pourriez également avoir plus de chance en utilisant la bibliothèque ctypes car c'est une façon plus pythonique de parler aux bibliothèques C. –

Répondre

2

Cela peut ne pas être la cause de votre problème, mais la signature PinVoke semble incorrecte. La fonction C prend un caractère *, pas un caractère.

  1. Ceci correspond à une chaîne dans une signature PinVoke. Vous devrez peut-être spécifier le CharSet pour assurer une bonne gestion, en fonction des plates-formes que vous ciblez. Voir http://www.mono-project.com/Interop_with_Native_Libraries#Strings
  2. Cette modification signifie que vos besoins en variables 'args' seront également ajustés. Vous voulez la chaîne "sample", pas le premier caractère.
  3. Note latérale: Le type de caractère en C# correspond à un caractère de 2 octets, pas à un octet.