私の 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の呼び出し方にあると思いますが、解決策が見つかりません。
誰か私に何か提案をしてもらえますか? どうもありがとう。
ロベルト