2011-12-28 4 views
0

Я использую System.Runtime.InteropServices для вызова нескольких функций, написанных на C++ из моего приложения C#. У меня просто проблемы с определенной функцией, которая возвращает массив.Проблемы с упаковкой C++ DLL из C#

Я видел, что моя функция не должна возвращать что-либо, а указатель на «возвращаемую переменную» должен быть включен. Но я не справляюсь с этим.

Например, если у меня есть функция в C++

void func(double *y, double *x){...} 

, которая манипулирует массив х и возвращает массив у.

Я делаю:

-в моей .h:

extern "C" __declspec(dllexport) void func(double *y,double *x); 

-в моего .cpp:

__declspec(dllexport) void func(double *y,double *x){...} 

-в моими C# код:

static class AnyClass 
    { 
    [DllImport(dllPath)] 
    public extern static void func(out double[] y, double[] x); 

    int otherfunc 
    { 
     double[] x = new double[5]; 
     double[] y = new double[5]; 

     ... 

     func(out y, x); 
    } 
    } 

, но он дает мне System.EntryPointNotFoundException.

Любой ключ?

+1

Вы уверены, что имена 'func' и' function' верны? Потому что они не выглядят одинаково, как они должны ... – Timbo

+1

Ваш первый фрагмент кода имеет «x» в качестве второго параметра, а ваши более поздние - в обратном порядке. Вы должны сделать это согласованным для ясности. –

+1

И ваша функция работает только с массивами размером 5? Или вам нужен параметр размера? – crashmstr

ответ

3

EntryPointNotFoundException означает, что в вашей DLL ничего не найдено «функция».

В вашем файле .h вы называете это «func». Но в вашем .cpp-файле вы называете его «функцией». И поскольку ваш .h-файл - это единственное место, которое объявляет extern "C", то, что фактически происходит, является то, что функция экспортируется вашей DLL-C++-style-name-mangled вместо обычного c-стиля. Итак, когда C# ищет функцию «c» в стиле c-c, он не может ее найти.

+0

Просто ошибка при запросе. Оба имеют одно и то же имя – Bruna

+0

Затем убедитесь, что функция в файле .cpp также является внешним «C». –

+0

Все еще не работает ... =/ – Bruna

1

Думаю, вы также должны указать extern "C" в вашем .cpp файле. Если нет, вы можете получить две разные функции: func, только с правильной привязкой, которая будет объявлена ​​и не определена.

Примечание: Afair ссылка extern "C" также указывает, как функции называются в DLL-файле. Для функций C++ некоторые пред. postfixes добавляются к имени, относящемуся к сигнатуре (т. е. к параметрам и типу возврата). Это необходимо, потому что вы можете перегружать функции на C++. Поэтому, если вы не укажете extern "C", функции будут именоваться по-разному в DLL и, следовательно, не могут быть найдены управляемым кодом.

1

EntryPointNotFoundException означает, что во время выполнения не удалось найти указанное имя функции в вашей DLL.

Возможные причины

  • опечатка имя функции в вашей DLL или программу
  • The вы не дезактивировать имя коверкая (extern "C")

Первая причина легко найти , просто проверьте все имена и убедитесь, что они действительно равны.Если по какой-то причине вы не можете изменить DLL, но, как и другое имя из C#, вы можете использовать свойство DllImportAttribute.EntryPoint, чтобы указать на функцию другого имени.

Второе затруднительно. Чтобы диагностировать проблему, я предлагаю вам использовать Dependency Walker, чтобы узнать, что происходит в вашей скомпилированной DLL. Используя этот инструмент, вы можете увидеть имена функций и быть ли они C++ 'ified или нет.

Вы уже пытались использовать extern "C", чтобы убедиться, что имя функции не страдает от имени mangling. Возможно, вы не включили файл .h из вашего .cpp-файла, чтобы компилятор вообще не видел extern "C".

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