0

C#で使用するために基本的なC++DLLを実行しようとしています。次のクラスが使用されます。

私の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)..アイデアはありますか?また、c#アプリケーションのビンに.dllファイルをコピーしました...

ありがとう!

4

3 に答える 3

1

refクラス(したがってC ++ / CLI dll)がある場合は、DllImportはまったく必要ありません。C#プロジェクトにdllへの参照を追加し、関数「C#way」を呼び出すMathFuncs.Add()だけです。プラットフォームが一致していること、およびCLI dllが依存するすべてのネイティブdllがパスに含まれていることを確認する必要があります)

于 2012-05-01T10:01:27.787 に答える
0

通常、これは、x64プログラムまたはその逆でx32DLLを使用しようとしているときに発生します。

于 2012-05-01T08:18:01.630 に答える
0

「不正な形式」の例外は常に、異なるプラットフォーム用にコンパイルされたモジュール、つまり32ビットと64ビットをロードしていることを意味します。DLLとC#アプリが同じプラットフォーム用にコンパイルされていることを確認してください。C#が「任意のプラットフォーム」に設定されている場合は、DLLの対象となるプラットフォームを明示的に選択してください。

于 2012-05-01T08:19:13.293 に答える