我有个小问题要问你。
我有一个C++源代码和一个头文件。C++文件使用windows.h库,使用串口进行操作(基本操作:read(),write()等)。
我想做的是,使用这些文件创建库,并在我的C#.Net solution中使用该库。
我需要创建什么类型的库?我该怎么做呢?创建库后,如何将其导入C# solution?
我向您致以最良好的问候。
我正在使用的代码部分:
// 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));
}
发布于 2011-12-03 22:41:29
在几条评论之后,这里尝试一下:
C++代码(DLL),例如:编译为HighSpeedMath.dll的math.cpp:
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",没有异常,没有引用等。
编辑:
如果您的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;
}
发布于 2011-12-03 16:54:48
您需要将C++代码编译到动态链接库中,并在C#中执行以下操作:
class MyClass
{
[DllImport("MyDLL.dll")]
public static extern void MyFunctionFromDll();
static void Main()
{
MyFunctionFromDll();
}
}
发布于 2011-12-03 17:29:42
除了Lichian提供的编译成常规DLL并使用p/invoke (这可能是最简单的方法)之外,您还可以将C++创建为COM组件(可能是您不想做的事情),第三种选择是添加一层薄薄的C++/CLI层,例如
using namespace System;
namespace youcomany{ namespace CPPWrapper
{
Wrapper::Function(String^ parameter)
{
//call the rest of you C++ from here
}
}}
https://stackoverflow.com/questions/8366590
复制相似问题