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”吗?如果是,如何添加?再次感谢你。。。