Потреблять родную DLL в C # - PullRequest
       36

Потреблять родную DLL в C #

0 голосов
/ 23 февраля 2012

Мы наняли программиста на C для разработки нативного компонента для использования в приложении .NET. Мы договорились о концептуальном API. Я передам его методу два массива, и он вернет массив. Я получил код сегодня. Вот файл заголовка. Настоящие имена скрыты:

__declspec(dllexport) int NativeMethod(
    struct params * config,
    int c_input_a_rows, 
    struct input_a_row *input_a_rows,
    int c_input_b_rows, 
    struct input_b_row *input_b_rows,
    int c_count, 
    int *p_c_output_rows, 
    struct output_row * output_rows);

struct params
{
    int a;
    int b;
    int c;
    double d;
    double e;
    int f;
    int g;
    char h[1000];
};

struct input_a_row
{
    int a;
    int b;
    double c;
};

struct input_b_row
{
    int a;
    int b;
    int c;
    int d;
    int e;
    double f;
    double g;
};

struct output_row
{
    int a;
    int b;
    int c;
    int d;
    int e;
    int f;
    int g;
    double h;
    double i;
    double j;
};

Исходя из этого, я сгенерировал код .NET, используя P / Invoke Interop Assistant . Я не смог заставить его работать, открыв DLL. Он пожаловался, что файл не имеет манифеста сборки. Поэтому я подключил заголовочный файл к SigImpl Translate Snipped и получил следующее:

[DllImport("the.dll", EntryPoint="NativeMethod")]
public static extern int NativeMethod(
    ref params config,
    int c_input_a_rows, 
    ref input_a_row input_a_rows,
    int c_input_b_rows, 
    ref input_b_row input_b_rows,
    int c_count, 
    ref int p_c_output_rows, 
    ref output_row output_rows);

Он также создает все структуры, как ожидалось. У каждого есть атрибут класса:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]

Два вопроса. Правильно ли сгенерирован этот код? Во-вторых, как мне это использовать? Подпись не имеет массивов. Я знаю, что мне, вероятно, нужно как-то использовать указатели, но как? Я не ожидаю, что вы решите это для меня, но можете ли вы указать мне какой-то способ понять, как это понять, не пройдя курс по низкому нативному программированию? Спасибо!

1 Ответ

0 голосов
/ 24 февраля 2012

Хорошо, после того, как я отправил этот вопрос, я снова начал взламывать. Первое, что я попробовал, сработало!

    private static extern int NativeMethod(
        params config,
        input_a_row[] input_a_rows,
        input_b_row[] input_b_rows,
        int count,
        ref output_row[] output_rows);

Есть еще одна вещь, которую я должен был сделать. Я получаю сообщение об ошибке, что точка входа не найдена. Я решил это, используя DUMPBIN (из консоли VS), чтобы выяснить, что экспорт на самом деле был назван ?NativeMethod@@YAHPAUconfig@@HPAUinput_row_a@@HPAUinput_row_b@@HPAHPAUoutput_row@@@Z Насколько это хрупко?!

...