如何在C#程序中使用Visual C ++编写的DLL?

时间:2012-11-04 19:33:18

标签: c# c++ visual-studio-2010

  

可能重复:
  C# P\Invoke DLL no entry point into C++?

我在SO和google上进行了相当彻底的冲浪后问了这个问题,而且大部分答案都让我大约80%,但它仍然有点令人困惑,所以请告诉我出路。< / p>

我有一些Visual C ++函数定义如下:


MyDLL.h

#ifdef FUNCTIONS_EXPORTS
#define FUNCTIONS_API __declspec(dllexport) 
#else
#define FUNCTIONS_API __declspec(dllimport) 
#endif

namespace Functions {
    class MyFunctions {
    public:
        static FUNCTIONS_API int Add(int a, int b);
        static FUNCTIONS_API int Factorial(int a);
    };
}

MyDLL.cpp

namespace Functions {
    int MyFunctions::Add (int a, int b)
    {
        return a+b;
    }
    int MyFunctions::Factorial (int a)
    {
        if(a<0)
            return -1;
        else if(a==0 || a==1)
            return 1;
        else
            return a*MyFunctions::Factorial(a-1);
    }
}

现在,我想将此构建生成的DLL导入到我的C#程序中:

Program.cs的

using System;
using System.Collections.Generic;    
using System.Runtime.InteropServices;

namespace DLLTester
{
    class Program
    {
        [DllImport("path\\to\\the\dll\\myDLL.dll")]
        public static extern int Factorial(int a);
        static void Main(string[] args) {
            int num;
            num = int.Parse(Console.ReadLine());
            Console.WriteLine("The factorial is " + Factorial(num));
        }
    }
}

我尝试在没有类的情况下编写函数(在定义时没有static关键字),但即使这样也不起作用并且会出错。

这一切在哪里出错?

1 个答案:

答案 0 :(得分:1)

我看到的最大问题是你正在尝试p / invoke类方法。由于C++ name mangling,您提供的入口点不存在于已编译的DLL中。您应该可以在DLL上运行dumpbin.exe并亲自查看。

使用C ++类时,我总是遵循在C ++端创建处理C ++类创建的“管理器”方法的模式。创建方法创建一个对象(在C ++端),将其存储在一个数组中,并返回一个整数Id,我用它来进一步调用该实例。 This article概述了与此类似的方法,并且还涵盖了直接使用类实例(此方法依赖于导入在使用单个编译器时应该是确定性的受损名称)。

我建议略读名称修改文章以及如何为DllImport目的阻止它,并阅读上一段中链接的大部分CodeProject文章。它编写得很好,涵盖了很多p / invoke细节。