c++编写的dll和c#调用

C++ written dll and C# call

本文关键字:调用 dll c++      更新时间:2023-10-16

长时间阅读后,我没有得到dll工作…
我试了很多不同的方法,但都没用。

我做了以下事情:(IDE: VS2013Ultimate)

  1. 我添加了一个干净的c++项目。在那里我添加了一个头文件[header.h]:

    #pragma once
    class myClass{
    public:
        myClass(double varx, double vary);
        double sumxy();
    private:
        double x;
        double y;
    };
    
  2. 我添加了body.cpp文件:

    #pragma once
    #include "header.h"
    myClass::myClass(double varx, double vary){
        x = varx;
        y = vary;
    }
    double myClass::sumxy(){
        return x + y;
    }
    

    这就是我需要的所有代码。我只想要一个工作的示例代码。

  3. 我添加了一个类[main.cpp]:

    #include "header.h"  
    #include "body.cpp"  
    extern "C" __declspec(dllexport) double sumxy(double var_x, double var_y){
        myClass MC(var_x, var_y);
        return MC.sumxy();
    }
    
  4. 之后,我编译了这个dll,我得到了它没有任何编译错误。我把它复制到c#控制台应用程序

  5. 的调试文件夹中
  6. c# Console Application:

    using System.Runtime.InteropServices;
    //all using directories
    namespace Klassen_Tester {
        class Program {
            [DllImport("CppClassDll.dll")]
            public static extern double sumxy(double var_x, double var_y);
            static void Main(string[] args) {
                Console.WriteLine(sumxy(3, 5).ToString());
                Console.ReadLine();
            } 
        }
    }
    

请帮帮我。不知道该怎么办……对不起,我的英语不好。

编辑:有一个错误:System。Klassen_Tester.exe中的DllNotFoundException。找不到DLL "CppClassDll.dll"。

您可以考虑在c++和c#之间使用互操作,这样您就不必与pinvoke混淆了。我并不是说调用不好,而是说互操作很好。

你想要写一个CLR包装器作为托管和非托管代码之间的中介。看起来你已经写了c#和c++的大部分,所以我将描述CLR部分。

  1. 在Visual Studio中创建CLR项目
  2. 添加本地c++项目作为参考
  3. 编写包装器
  4. 从c#项目中添加CLR项目的引用
  5. 调用CLR包装器

用你的c++签名创建一个类:

namespace YourWrapper
{
    public ref class WrappedFunction
    {
        public:
            // Adjust according to your c++ class and function
            double sumxy(double a, double b) {
                return myClass::sumxy(a, b);
            }       
    };
}

完整示例请参见我的项目https://github.com/corytodd/interop-example: