0

可能重复:
C# P\Invoke DLL 没有进入 C++ 的入口点?

在对 SO 和 google 进行了相当彻底的浏览后,我在问这个问题,大多数答案让我了解了大约 80% 的情况,但它仍然有点令人困惑,所以请告诉我出路。

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


我的DLL.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);
    };
}

我的DLL.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# 程序中,如下所示:

程序.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定义时没有关键字),但即使这样也不起作用并给出错误。

这一切我哪里错了?

4

1 回答 1

1

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

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

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

于 2012-11-04T20:24:20.873 回答