2012-02-23 3 views
0

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

__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 Перевести пропущено и получил это:

[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)] 

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

ответ

0

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

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), чтобы узнать, что на самом деле экспорт был указан [email protected]@[email protected]@[email protected]@[email protected]@[email protected]@@Z. Насколько хрупким это ?!

+0

Чтобы отключить изменение имени C++, объявите их как extern «C». Google для точного синтаксиса. –

+0

Или используйте файл .def на стороне C вещей, которые расскажут компоновщику точно, как назвать функцию. –

Смежные вопросы