Как создать 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
        }
}}