3

可能重复:
Visual C++ 托管应用程序:找不到名为“添加”的入口点</a>

我正在学习在 C# 中使用平台调用。我按照msdn上的教程进行操作:

它与 C++ 完美配合使用 MathFuncsDll.dll。

当我使用:

[DllImport("MathFuncsDll.dll")] 

在我的 C# 代码中,引发了一个 dll not found 异常。然后我将其更改为:

[DllImport("C:\\...\\MathFuncsDll.dll")] 

然后出现未找到入口点异常。

我该如何解决这些问题?

为澄清起见,这是我的代码:C++ dll:

头文件:

//MathFuncsDll.h

#ifdef MATHFUNCSDLL_EXPORTS
#define MATHFUNCSDLL_API __declspec(dllexport) 
#else
#define MATHFUNCSDLL_API __declspec(dllimport) 
#endif

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);
    };
}

.cpp 文件:

// 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# 应用程序调用函数:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace CSharpConsole
{
    class Program
    {
        //[DllImport("MathDll.dll")]

        [DllImport(@"C:\Users\...\Debug\MathDll.dll")]
        public static extern double Add(double a, double b);
        static void Main(string[] args)
        {
            double a = 6.2;
            int b = 3;

            Console.WriteLine(Add(a,b));
        }
    }
}

我为此创建了一个全新的解决方案,第一个 DllIport 行仍然不起作用。第二行给出入口点异常。

4

2 回答 2

2

当你使用

[DllImport("MathFuncsDll.dll")]

系统会在DLL 搜索路径中寻找 DLL 。搜索的第一个位置是包含您的可执行文件的目录。这是放置 DLL 的最佳位置。

如果您看到“未找到入口点”,则仅表示未找到入口点。

您链接到的文章不使用 p/invoke 链接到 C++ DLL。该文章描述了如何从托管 C++ 链接到本机 DLL。因此,由于您使用的是 C# 和 p/invoke,因此您似乎在做一些不同的事情。除非你提供你正在做什么的精确细节,例如代码,否则很难开出补救措施。


好的,现在您已经添加了一些代码。这很有帮助。

您不应该对 p/invoke 导出使用静态方法。删除MyMathFuncs并具有普通的旧 C 样式函数:

extern "C" 
{

    double __declspec(dllexport) Add(double a, double b)
    {
         return a + b;
    }
}

不需要声明这些函数的头文件。只需一个 .cpp 文件即可完成。的使用extern "C"可以防止您的名字被 C++ 编译器破坏。

如果您需要检查 DLL 以查看它导出的内容,请使用 Dependency Walker。

在 C# 端使用:

[DllImport(@"...", CallingConvention=CallingConvention.Cdecl)]
public static extern double Add(double a, double b);
于 2012-11-21T11:09:35.637 回答
0

您确定指定的 .dll 与您正在运行的可执行文件存在于同一文件夹中吗?因为这是 .NET 将首先搜索您的 .dll 的地方。如果在那里找不到,它将搜索 GAC。但我怀疑你把它放在那里。

也可能是权限问题(尽管不太可能),请参阅此问题以获取更多信息:DllImport 生成 System.DllNotFoundException

于 2012-11-21T11:12:24.070 回答