首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C#中创建C++动态链接库

如何在C#中创建C++动态链接库
EN

Stack Overflow用户
提问于 2011-12-03 16:49:22
回答 4查看 29.9K关注 0票数 13

我有个小问题要问你。

我有一个C++源代码和一个头文件。C++文件使用windows.h库,使用串口进行操作(基本操作:read(),write()等)。

我想做的是,使用这些文件创建库,并在我的C#.Net solution中使用该库。

我需要创建什么类型的库?我该怎么做呢?创建库后,如何将其导入C# solution?

我向您致以最良好的问候。

我正在使用的代码部分:

代码语言:javascript
复制
// 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#导入部分:

代码语言:javascript
复制
[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));
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-03 22:41:29

在几条评论之后,这里尝试一下:

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

代码语言:javascript
复制
extern "C"
{
    __declspec(dllexport) int __stdcall math_add(int a, int b)
    {
        return a + b;
    }
}

C#代码,例如Program.cs:

代码语言:javascript
复制
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

代码语言:javascript
复制
#ifndef MATH_HPP
#define MATH_HPP

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

#endif

math.cpp

代码语言:javascript
复制
#include "math.hpp"

int __stdcall math_add(int a, int b)
{
    return a + b;
}
票数 13
EN

Stack Overflow用户

发布于 2011-12-03 16:54:48

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

代码语言:javascript
复制
  class MyClass
  {
  [DllImport("MyDLL.dll")]
  public static extern void MyFunctionFromDll();

        static void Main()
        {
              MyFunctionFromDll();
        }
  }
票数 6
EN

Stack Overflow用户

发布于 2011-12-03 17:29:42

除了Lichian提供的编译成常规DLL并使用p/invoke (这可能是最简单的方法)之外,您还可以将C++创建为COM组件(可能是您不想做的事情),第三种选择是添加一层薄薄的C++/CLI层,例如

代码语言:javascript
复制
using namespace System;

namespace youcomany{ namespace CPPWrapper
{
    Wrapper::Function(String^ parameter)
    {
        //call the rest of you C++ from here
        }
}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8366590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档