QuantLib に小さな機能を追加し、それを SWIG バインディングと共にコンパイルして、Visual Studio 2010 の C# プロジェクトで使用したいと考えています。しかし、ほぼ毎回問題が発生しています。Visual Studio 2010 での QuantLib の構築、SWIG バインディングの作成、C# プロジェクトの構築に必要な手順は何ですか?
- http://sourceforge.net/projects/quantlib/files/から QuantLib をダウンロードしました
- Boost をhttp://sourceforge.net/projects/boost/files/boost/1.49.0/からダウンロードしました
- http://sourceforge.net/projects/quantlib/files/QuantLib/1.0/bindings/QuantLib-SWIG-1.0.zip/downloadから QuantLib+SWIG バインディングをダウンロードしました。
- 環境変数 QL_DIR を「C:\pathToFolder\QuantLib-1.2\lib」に設定しました (コンピューター > プロパティ > 詳細システム設定 > 詳細設定 > 環境変数)
- C:\pathToFolder\QuantLib-SWIG-1.0\CSharp にある swig.cmd ファイルを実行しました。
- Visual Studio 2010 で QuantLib_vc9.sln を開きました
- NQuantLibc プロジェクトの場合:
- Boost ディレクトリと QuantLib ディレクトリをヘッダー ディレクトリに含めました。
- QuantLib/lib ディレクトリをライブラリ ディレクトリに含めました。
- NQuantLibc プロジェクトのビルドに成功しました
- NQuantLib_vc9 プロジェクトの場合:
- NQuantLibc プロジェクトに依存させました。
- NQuantLib_vc9 プロジェクトのビルドに成功しました。
- EquityOption_vc9 プロジェクトの場合:
- NQuantLib_vc9 プロジェクトに依存させました。
- EquityOption_vc9 プロジェクトのビルドに成功しました。
- 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 に追加することができましたが、これは確かに小さな機能です。この小さな編集が私のプロジェクトを遅らせています。この問題について助けていただければ幸いです。