Как создать dll в C++ для использования в C#
Я немного вопрос.
у меня есть один источник C++ и один файл заголовка. Файл C++ использует windows.H библиотека, выполняет операции с использованием последовательного порта(основные операции:read(), write() etc.).
что я хочу сделать, это создать библиотеку с помощью этих файлов и использовать эту библиотеку в моем C#.Net решение.
какой тип библиотеки мне нужно создать? Как я могу это сделать? После создания библиотеки, как я могу импортировать ее в 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 <stdexcept>
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;
}
}
часть импорта C#:
[DllImport("SimpleDll.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern double Add(double a, double b);
static void Main(string[] args)
{
string a = Add(1.0, 3.0));
}
4 ответов
после нескольких комментариев, здесь попробуйте:
код C++ (DLL), например. математика.cpp, скомпилированный в HighSpeedMath.dll:
extern "C"
{
__declspec(dllexport) int __stdcall math_add(int a, int b)
{
return a + b;
}
}
код C#, например. Программа.cs:
namespace HighSpeedMathTest
{
using System.Runtime.InteropServices;
class Program
{
[DllImport("HighSpeedMath.dll", EntryPoint="math_add", CallingConvention=CallingConvention.StdCall)]
static extern int Add(int a, int b);
static void Main(string[] args)
{
int result = Add(27, 28);
}
}
}
конечно, если точка входа уже совпадает, вам не нужно ее указывать. То же самое с соглашением о призвании.
как упоминалось в комментариях, DLL должна предоставить C-интерфейс. Это означает, extern "C" , никаких исключений, никаких ссылок так далее.
Edit:
если у вас есть заголовок и исходный файл для вашей DLL, он может выглядеть так:
математика.ГЭС
#ifndef MATH_HPP
#define MATH_HPP
extern "C"
{
__declspec(dllexport) int __stdcall math_add(int a, int b);
}
#endif
математика.cpp
#include "math.hpp"
int __stdcall math_add(int a, int b)
{
return a + b;
}
вам нужно скомпилировать код C++ в динамическую библиотеку ссылок и сделать следующее В C#:
class MyClass
{
[DllImport("MyDLL.dll")]
public static extern void MyFunctionFromDll();
static void Main()
{
MyFunctionFromDll();
}
}
вы можете использовать C# DllImport и Dllexport для взаимодействия DLL пошаговое руководство в качестве отправной точки. И вот Платформа Вызвать Учебник
надеюсь, что это помогает.
в дополнение к предложению Lichian скомпилировать в обычную DLL и использовать p / invoke, что, вероятно, является самым простым способом Вы также можете создать свой C++ как COM-компонент (возможно, то, что вы не хотите делать) , и 3-й вариант-добавить тонкий слой C++/CLI например,
using namespace System;
namespace youcomany{ namespace CPPWrapper
{
Wrapper::Function(String^ parameter)
{
//call the rest of you C++ from here
}
}}