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.
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. –