【问题标题】:C++ DLL imported into a C# application导入 C# 应用程序的 C++ DLL
【发布时间】:2012-05-10 19:56:05
【问题描述】:

我正在尝试做一个基本的 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 中...

谢谢!

【问题讨论】:

  • DLL 文件是 32 位还是 64 位?你的 clr 是 32 位还是 64 位?通常是与您的错误相关的这种类型的不兼容。
  • 你这样做是错误的。如果你有一个 ref 类(因此有一个 C++/CLI dll),你根本不需要 DllImport:只需添加对 dll 的引用C# 项目并以“C# 方式”调用函数,即 MathFuncs.Add()

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


【解决方案1】:

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

【讨论】:

  • @stijin.. 我的应用程序由结构组成.. 我应该在哪里定义结构?在标题或 .cpp 中?此外,一些方法返回一个指向结构实例的指针。我该怎么做?因为我一遍又一遍地收到相同的错误..错误如下:'错误 27 错误 C2027:使用未定义类型'
  • 通常你会在头文件中声明结构,并在源代码 (cpp) 中提供定义。 C2027 表示您正在使用编译器不知道的类型。最好为此提出一个单独的问题并发布代码,否则无法回答此问题。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2011-11-06
      • 2018-07-23
      相关资源
      最近更新 更多