2

QuantLib に小さな機能を追加し、それを SWIG バインディングと共にコンパイルして、Visual Studio 2010 の C# プロジェクトで使用したいと考えています。しかし、ほぼ毎回問題が発生しています。Visual Studio 2010 での QuantLib の構築、SWIG バインディングの作成、C# プロジェクトの構築に必要な手順は何ですか?

  1. http://sourceforge.net/projects/quantlib/files/から QuantLib をダウンロードしました
  2. Boost をhttp://sourceforge.net/projects/boost/files/boost/1.49.0/からダウンロードしました
  3. http://sourceforge.net/projects/quantlib/files/QuantLib/1.0/bindings/QuantLib-SWIG-1.0.zip/downloadから QuantLib+SWIG バインディングをダウンロードしました。
  4. 環境変数 QL_DIR を「C:\pathToFolder\QuantLib-1.2\lib」に設定しました (コンピューター > プロパティ > 詳細システム設定 > 詳細設定 > 環境変数)
  5. C:\pathToFolder\QuantLib-SWIG-1.0\CSharp にある swig.cmd ファイルを実行しました。
  6. Visual Studio 2010 で QuantLib_vc9.sln を開きました
  7. NQuantLibc プロジェクトの場合:
    1. Boost ディレクトリと QuantLib ディレクトリをヘッダー ディレクトリに含めました。
    2. QuantLib/lib ディレクトリをライブラリ ディレクトリに含めました。
    3. NQuantLibc プロジェクトのビルドに成功しました
  8. NQuantLib_vc9 プロジェクトの場合:
    1. NQuantLibc プロジェクトに依存させました。
    2. NQuantLib_vc9 プロジェクトのビルドに成功しました。
  9. EquityOption_vc9 プロジェクトの場合:
    1. NQuantLib_vc9 プロジェクトに依存させました。
    2. EquityOption_vc9 プロジェクトのビルドに成功しました。
  10. EquityOption_vc9 プロジェクトを実行しようとすると、「不正な形式のプログラムを読み込もうとしました」という TypeInitializationException が発生します。

完全な例外は次のとおりです。

System.TypeInitializationException was unhandled
  Message=The type initializer for 'QuantLib.NQuantLibcPINVOKE' threw an exception.
  Source=NQuantLib
  TypeName=QuantLib.NQuantLibcPINVOKE
  StackTrace:
       at QuantLib.NQuantLibcPINVOKE.new_Date__SWIG_1(Int32 jarg1, Int32 jarg2, Int32 jarg3)
       at QuantLib.Date..ctor(Int32 d, Month m, Int32 y) in C:\Users\JRobinson\Desktop\QuantLib-SWIG-1.0\CSharp\csharp\Date.cs:line 48
       at EquityOptionTest.EquityOption.Main(String[] args) in C:\Users\JRobinson\Desktop\QuantLib-SWIG-1.0\CSharp\examples\EquityOption.cs:line 43
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.TypeInitializationException
       Message=The type initializer for 'SWIGExceptionHelper' threw an exception.
       Source=NQuantLib
       TypeName=SWIGExceptionHelper
       StackTrace:
            at QuantLib.NQuantLibcPINVOKE.SWIGExceptionHelper..ctor()
            at QuantLib.NQuantLibcPINVOKE..cctor() in C:\Users\JRobinson\Desktop\QuantLib-SWIG-1.0\CSharp\csharp\NQuantLibcPINVOKE.cs:line 126
       InnerException: System.BadImageFormatException
            Message=An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
            Source=NQuantLib
            StackTrace:
                 at [long string removed]
                 at QuantLib.NQuantLibcPINVOKE.SWIGExceptionHelper..cctor() in C:\Users\JRobinson\Desktop\QuantLib-SWIG-1.0\CSharp\csharp\NQuantLibcPINVOKE.cs:line 106
        InnerException: 

デバッグ構成ですべてをビルドしたことに注意してください。リリース構成を使用してこれも試しました。うまくいきませんでした。

このタイプのプロジェクトを構築する方法を詳述した完全な手順を見つけることができれば幸いです。ここでいくつかの指示を見つけました.Compiling Quantlib via SWIG for C#ですが、動作させることができませんでした。

QuantLib ページには、Visual Studio 2010 で QuantLib を構築するための手順が含まれています ( http://quantlib.org/install/vc10.shtml )が、SWIG バインディングの作成に支援が必要です。

Resolver Systems には、私に適したビルド済みの C# バインディングが用意されています。 http://www.resolversystems.com/products/quantlib-binary/このパッケージで C# の QuantLib コードを問題なく実行できました。私の問題は、C# プロジェクトで使用するために QuantLib コードに小さな機能を追加する必要があることです。これが、QuantLib を再構築し、SWIG バインディングを再作成する必要がある理由です。

QuantLib の C# ポートである QLNet ( http://sourceforge.net/projects/qlnet/ )については知っていますが、このプロジェクトにはいくつかの部分が欠けており、積極的に開発されていないと思います。具体的には、個別の配当を支払うオプションの価格を設定できる必要があります。QLNet には、このためのコードの一部がありません。必要なコードを QuantLib から QLNet に移植しようとしましたが、間違った出力が得られたため、私の C++ は錆びているに違いありません。

QuantLib に追加する必要がある小さな機能は、端数日を処理する機能であることに注意してください。この機能を QLNet に追加することができましたが、これは確かに小さな機能です。この小さな編集が私のプロジェクトを遅らせています。この問題について助けていただければ幸いです。

4

2 に答える 2

2

確かに、配布されている SWIG ラッパーと .Net 4.0 には問題があるようです。

私はそのプラットフォームに取り組んでいないので、個人的な経験に基づいて話すことはできません. しかし、この問題は最近 QuantLib メーリング リストで議論され、Mark Gillis によって提供された解決策が機能することが報告されました。関連するスレッドはhttp://thread.gmane.org/gmane.comp.finance.quantlib.user/8238で読むことができます。お役に立てれば...

于 2012-03-23T08:18:58.977 に答える
0

少し前にこの正確なエラーメッセージに苦労し、このページにアクセスしました.Google検索が「何度も」言うかもしれません.

結局、私のエラーはかなり良性でしたが、それを整理するのにしばらく時間がかかりました.

SWIG の C# ラッパーを使用して QuantLib C++ ライブラリにアクセスしていました。Excel DNA Integration を使用して Quantlib.xll を作成し、Quantlib にアクセスするいくつかの .exe も作成しました。

さまざまな状況で、このエラーが表示される可能性があります。特に

  1. デスクトップから .exe を実行する (「時々」)
  2. 自分の XLL を他のユーザーに (常に) 配布します。

最終的に、私の VS2010 (および 12、13、15) プロジェクトの bin フォルダーから取得していたディストリビューションには、NQuantLib (C# ラッパー コード) は含まれていましたが、NQuantLibc (呼び出された C++ アンマネージ コード) は含まれていなかったことがわかりました。 .

XLL と exe が私のマシンで動作することもありましたが、それはおそらく (パスを変更することで) 欠落している C++ コードを見つけるのを手伝ったためですが、プロセスのそのステップを思い出せませんでした。

私がそれを理解したら(StackOverflowヒントを使用して、別のマシンでコードを実行し、VSを開いて爆撃したときにデバッグするときにエラーの「内部例外」をチェックします)、問題はなくなりました。

少し時間がかかりましたが、少し経験を積むことができました。

私にとって、このエラーは、マネージ (C#) ライブラリが見つけられる場所にアンマネージ (C++) ライブラリを配置しなかったことが原因でした。

于 2016-03-02T19:49:14.177 に答える