C ++ / CLI - вызов неуправляемой функции, определенной в DLL - PullRequest
1 голос
/ 09 февраля 2012

У меня есть DLL, которая содержит неуправляемые классы с методами.Я пытаюсь вызвать эти методы из C ++ / CLI.

Мое чтение привело меня к выводу, что для этого используется P / Invoke.Однако я не могу понять, как заставить его работать.

В DLL определен следующий класс:

//Header:
namespace MathFuncs
{
    class MyMathFuncs
    {
    public:
        static __declspec(dllexport) double Add(double a, double b);
        static __declspec(dllexport) double Subtract(double a, double b);
        static __declspec(dllexport) double Multiply(double a, double b);
        static __declspec(dllexport) double Divide(double a, double b);
    };
}

//Source:
namespace MathFuncs
{
    double MyMathFuncs::Add(double a, double b) {
        return a + b;
    }

    double MyMathFuncs::Subtract(double a, double b) {
        return a - b;
    }

    double MyMathFuncs::Multiply(double a, double b) {
        return a * b;
    }

    double MyMathFuncs::Divide(double a, double b) {
        if (b == 0) {
            throw new invalid_argument("b cannot be zero!");
        }
        return a / b;
    }
}

Из того, что я прочитал, следующеедолжен объявить метод в моем коде C ++ / CLI, который я затем могу вызвать в своем коде:

class MyMathFuncs {
public:
[DllImport("TestDLL.dll")]
    static double Add(double a, double b);
};

Где "TestDLL.dll" - моя DLL.

Я получаю ошибкуво время выполнения.Он говорит: «Невозможно найти точку входа с именем« Добавить »в DLL« TestDLL.dll »».

Что я делаю не так?Я прочитал статьи MSDN по этому вопросу, но я не понимаю этого.

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Вы создали файл DEF для своей собственной DLL?

Dumpbin также может помочь.Посмотрите, что экспортирует DLL:

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

решаемая. Мне нужно включить EntryPoint функции в DLL в атрибуте DllImport. Тем не менее, документация MSDN предполагает, что EntryPoint может быть именем функции в DLL, но это не работает для меня - я должен указать порядковый номер функции. Кто-нибудь может дать мне знать, почему это так?

...