C# 如何在C++;在C中使用#

C# 如何在C++;在C中使用#,c#,c++,dll,serial-port,C#,C++,Dll,Serial Port,我有个小问题要问你 我有一个C++源和一个头文件。C++文件使用Windows .h库,使用串口(基本操作:读)、写()( >)进行操作。 我想做的是,使用这些文件创建一个库,并在我的C#.Net解决方案中使用该库 我需要创建什么类型的库? 我怎么做? 创建库后,如何将其导入C#解决方案 我的问候 我正在使用的代码部分: // MathFuncsDll.h namespace MathFuncs { class MyMathFuncs { public:

我有个小问题要问你

我有一个C++源和一个头文件。C++文件使用Windows .h库,使用串口(基本操作:<强>读)、写()(<强> >)进行操作。 我想做的是,使用这些文件创建一个库,并在我的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;
    }
}
[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));
}

您需要将C++代码编译成动态链接库,并在C ^中执行以下操作:


除了Lichian提供的编译到常规DLL并使用p/invoke之外,这可能是最简单的方法 还可以创建C++作为COM组件(可能是一些你不想做的),而你所拥有的第三个选项是添加一层C++ /CLI。 e、 g

您可以使用演练作为起点。这里是


希望这能有所帮助。

经过几番评论后,请尝试:

C++代码(DLL),如math.cpp,编译为HighSpeedMath.DLL:

extern "C"
{
    __declspec(dllexport) int __stdcall math_add(int a, int b)
    {
        return a + b;
    }
}
C代码,例如Program.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接口。也就是说,外部“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;
    }
}
[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));
}
如果您的DLL有一个头文件和一个源文件,它可能如下所示:

math.hpp

#ifndef MATH_HPP
#define MATH_HPP

extern "C"
{
    __declspec(dllexport) int __stdcall math_add(int a, int b);
}

#endif
math.cpp

#include "math.hpp"

int __stdcall math_add(int a, int b)
{
    return a + b;
}

你真的需要C++吗?NET有一个SerialPort类…我知道,但我必须使用它们。你可以使用
C++/CLI
而不是C,然后正常使用你的代码。@Adban我知道,先生,但它必须是C项目的一部分。@Un_NatMenDim:你仍然可以使用Arnon Rotem Gal Oz在你的C项目中说的。我不明白,你能扩展一下你的意思吗?哪一部分?您需要创建一个dll(在本例中,dll称为MyDLL.dll,并按照此处所示从dll声明函数(在本例中,MyFunctionFromDll())先生,我无法添加我创建的库。Visual Studio弹出一个错误。此外,我无法在我的C#解决方案中使用DllImport关键字。我想我需要添加使用System.Runtime.InteropServices;因此,我不必添加库作为在C#解决方案中使用的引用?仅使用DllImport?当我运行项目时,会发生异常。是说无法添加库C++。CLC++ C++是C++的,你可以调用任何你喜欢的东西。如果你需要在C和C++之间传递简单的参数,那么用GCNEW创建规则的C++对象,一般来说,DLLImport可能会更容易。如果你需要通过复杂类型的C++,CLI是EAS。IerrSimon,这就成功了。谢谢。但是,如果我的源文件有一个头文件呢?我必须再次添加外部“C”吗?如果是,如何添加?再次感谢你。。。