Как вызвать IronPython в Linux - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь вызвать функцию C из IronPython 2.6 в Ubuntu 10.10. Я использовал пример из IP-дистрибутива в качестве моей модели. Тем не менее код C выдает «StandardError: Исключение было сгенерировано целью вызова».

Я пробовал несколько подходов, но ни один из них не работает. Вот мой код:

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()

Файл объекта компилируется с помощью "gcc -c pinvoke_test.c -o pinvoke_test.o". Я надеюсь, что кто-то может указать мне правильное направление.

1 Ответ

2 голосов
/ 31 марта 2011

Возможно, это не является причиной вашей проблемы, но подпись pinvoke выглядит неправильно.Ваша функция C принимает символ *, а не символ.

  1. Отображается в строку в подписи pinvoke.Вам может потребоваться указать CharSet, чтобы обеспечить правильное распределение, в зависимости от целевых платформ.См. http://www.mono -project.com / Interop_with_Native_Libraries # Strings
  2. Это изменение будет также означать, что ваши переменные 'args' также должны быть измененыТребуется строка «образец», а не первый символ.
  3. Примечание: тип символа в C # соответствует 2-байтовому символу, а не байту.
...