C ++写的dll和C#调用

时间:2015-08-20 19:39:38

标签: c# c++ dll

经过漫长的阅读时间后,我没有让dll正常工作...... 我尝试了很多不同的方法,但没办法......

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

  1. 我添加了一个干净的c ++项目。在那里我添加了1个头文件[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. C#控制台应用程序:

    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();
            } 
        }
    }
    
  6. 请帮帮我。不知道该怎么做..抱歉我的英语不好。

    编辑:Klassen_Tester.exe中存在错误:System.DllNotFoundException。 DLL" CppClassDll.dll"无法找到。 HRESULT:0x8007007E)无法加载。

1 个答案:

答案 0 :(得分:0)

您可以考虑在C ++和C#之间使用互操作,这样您就不必乱用pinvoke。我不是说pinvoke很糟糕但是interops很好。

您将要编写CLR包装器以充当托管代码和非托管代码之间的中介。看起来你主要编写了C#和C ++,所以我将描述CLR部分。

  1. 在Visual Studio中创建CLR项目
  2. 添加您的原生C ++项目作为参考
  3. 写你的包装
  4. 从C#项目
  5. 添加对CLR项目的引用
  6. 调用CLR包装器
  7. 使用您的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