0

我正在尝试做一个基本的 C++ DLL 以便在 C# 中使用它。使用以下类:

我的cpp文件

#include "stdafx.h"    
#include "MathFuncsAssembly.h"

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 gcnew DivideByZeroException("b cannot be zero!");
        }

        return a / b;
    }
}

我的头文件

using namespace System;

namespace MathFuncs
{
    public ref class MyMathFuncs
    {
    public:
        static double Add(double a, double b);

        static double Subtract(double a, double b);

        static double Multiply(double a, double b);

        static double Divide(double a, double b);
    };
}

在我调用库的 C# 应用程序中

[DllImport("MathFuncsAssembly.dll")]
public static extern double Add(double a, double b);

static void Main(string[] args)
{
   Console.WriteLine(Add(10.0, 11.0));
   Console.ReadLine();
}

(Add(10.0,11.0)) 部分发生异常。抛出以下异常: 尝试加载格式不正确的程序。(HRESULT 例外:0x8007000B).. 有什么想法吗?另外,我将 .dll 文件复制到 c# 应用程序的 bin 中...

谢谢!

4

3 回答 3

1

如果你有一个 ref 类(因此是一个 C++/CLI dll),你根本不需要 DllImport:只需在 C# 项目中添加对 dll 的引用并调用函数'C#方式'即MathFuncs.Add()(注意你仍然需要确保平台匹配,并且 CLI dll 依赖的所有本机 dll 都在路径中)

于 2012-05-01T10:01:27.787 回答
0

当您尝试将 x32 DLL 与 x64 程序一起使用时,通常会发生这种情况,反之亦然。

于 2012-05-01T08:18:01.630 回答
0

“格式不正确”异常总是意味着您正在加载为不同平台编译的模块,即 32 位和 64 位。确保您的 DLL 和您的 C# 应用程序针对同一平台进行编译。如果 C# 设置为“任何平台”,请明确选择您的 DLL 所针对的平台。

于 2012-05-01T08:19:13.293 回答