Роман Ягодин
Роман Ягодин

C#/C++ простой код библиотеки Си++ подключаю в Си шарп (внутри)

// MathFuncsDll.h

namespace MathFuncs

{

class MyMathFuncs

{

public:

// Returns a + b

static __declspec(dllexport) double Add(double a, double b);

// Returns a - b

static __declspec(dllexport) double Subtract(double a, double b);

// Returns a * b

static __declspec(dllexport) double Multiply(double a, double b);

// Returns a / b

// Throws DivideByZeroException if b is 0

static __declspec(dllexport) double Divide(double a, double b);

};

}
==========

// MathFuncsDll.cpp

// compile with: /EHsc /LD

#include "MathFuncsDll.h"

#include

using namespace std;

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;

}

}
==========
==========

[DllImport("MathFuncsDll.dll", CharSet = CharSet.Unicode)]

public static extern double Multiply(double A, double B);

private void button4_Click(object sender, EventArgs e)

{

double temp = Multiply(3, 4);

}

ПИШЕТ МОЛ "Не удается найти точку входа "Multiply" в DLL "MathFuncsDll.dll"."

Александр Михайлов
Александр Михайлов

class MyMathFuncs {
...
static __declspec(dllexport) double Multiply(double a, double b);

Как видите, вы объявили функцию в классе, хоть и статическую.
Компилятор С++ декорирует имена функции классов (используйте dumpbin, чтобы глянуть, как названа функция Multiply на самом деле) .

В данном случае лучше просто экспортировать функцию, а не член класса.

// MathFuncsDll.h
extern "C" __declspec(dllexport) double Multiply(double a, double b);

// MathFuncsDll.cpp
double MyMathFuncs::Multiply(double a, double b) { return a * b; }

Как видите, работает, но мы теряем пространство имен, что не есть хорошо.
Варианты - переписать на С++/CLI, переписать на COM,
вводить "корявое" имя функции, или разбираться с декорированием имен.

https://stackoverflow.com/questions/935664/possible-to-call-c-code-from-c

АК
Алена Князева

http://otvet.mail.ru/question/171694496
В комментах к первому ответу есть готовый проект.

Похожие вопросы
где можно изучать сам язык си шарп, а не в визуал студии, просто код как работает, классы и прочее?
нужно переделать код с паскаля на си шарп
подскажите по Си шарпу
C# си шарп пожалуйста помогите
Си шарп c# помогите пожалуйста
задача по C# (си шарпу) , пожалуйста по-скорее
в си шарп на глаз какие значение выведут два кода?
Си шарп (C#). Помогите пожалуйста.
C# Как создать библиотеку на C++ что бы ее можно было потом использовать в Шарпе?
C#/C++ Если я DLL написанную на C++ подключаю в C# то библиотека работает со скоростью нативного кода или нет?