-1

私の c# コードでは、作成した dll によってエクスポートされるc++ 関数 ( myWrapper ) を呼び出す必要があります。

myWrapperが返されると、次のランタイム エラーが発生します。

実行時チェックの失敗 #0 - ESP の値が関数呼び出しで適切に保存されませんでした。これは通常、ある呼び出し規約で宣言された関数を、別の呼び出し規約で宣言された関数ポインターで呼び出した結果です。

以下に示すように、呼び出し規約を __cdecl として既に指定しています。

詳細には、私のC#コード:

class myClass
{
    [DllImport("MyWrapper.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void myWrapper();

    public void myMethod()
    {
        myWrapper();
    }
}

myWrapperの c++ コード:

#include "IpIpoptApplication.hpp"

extern "C" __declspec(dllexport) void (__cdecl myWrapper)()
{
    SmartPtr<IpoptApplication> solver = IpoptApplicationFactory();
    ApplicationReturnStatus status = solver->Initialize();  
}

IpoptAppliationFactory関数は、IpOptApplication.hppの外部 dll からインポートされます(これはオープン ソース プロジェクトの一部であり、https://projects.coin-or.org/svn/Ipopt/stable/3.11/Ipopt/src から表示できます)。 /Interfaces/IpIpoptApplication.hpp ) を次の行に追加します。

extern "C" __declspec(dllexport) class Ipopt::IpoptApplication * __cdecl IpoptApplicationFactory();

奇妙なことに、エラーはmyWrapper の「solver->Initialize()」呼び出されたときにのみ発生します。このメソッドの呼び出しにコメントすると、myWrapperはエラーなしで戻ります。この問題は、「Ipopt::IpoptApplication」の定義にも、IpoptApplicationFactory() または Initialize() の実装にも関連していません。なぜなら、1) よく知られているオープン ソース プロジェクト ( http://www.coin-or .org/projects/Ipopt.xml ) 数千人のプログラマーに使用されています。2) myWrapper は、C++ コードで記述されたスタンドアロンの実行可能ファイルで使用すると正しく動作します。

私はすでに何時間もグーグルで検索しましたが、問題はmyWrapperの呼び出し方にあると思いますが、解決策が見つかりません。

誰か私に何か提案をしてもらえますか? どうもありがとう。

ロベルト

4

1 に答える 1

0

Hans Passant のおかげで、問題は解決されました。"myWrapper" をリリース モードでコンパイルする必要があります。

IPOPT DLL は、リリース モードでのみコンパイルできます (IpOpt DLL と共に配布される readme.txt を参照してください)。このプロジェクトを常にリリース モードでコンパイルするように構成マネージャーを設定しました (ソリューションがデバッグ中の場合でも)。myWrapper 関数 (IpOpt dll を呼び出す) をデバッグするには、StartUp プロジェクトのプロパティで [アンマネージ コードのデバッグを有効にする] チェック ボックスを設定する必要があります。 myWrapper をデバッグする必要はありません。

これが役立つことを願っています

于 2015-01-14T07:28:46.663 に答える