我想向 QuantLib 添加一个小功能,并将其与 SWIG 绑定一起编译,以便在 Visual Studio 2010 中的 C# 项目中使用。但是,我几乎每一次都遇到问题。在 Visual Studio 2010 中构建 QuantLib、创建 SWIG 绑定和构建 C# 项目涉及哪些步骤?
- 我从http://sourceforge.net/projects/quantlib/files/下载了 QuantLib
- 我从http://sourceforge.net/projects/boost/files/boost/1.49.0/下载了 Boost
- 我从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:
请注意,我使用 Debug 配置构建了所有内容。我也尝试过使用 Release 配置。它没有用。
我希望我能找到一套完整的说明,详细说明如何构建这种类型的项目。我在这里找到了一些说明,通过 SWIG 为 C# 编译 Quantlib,但我无法让它工作。
QuantLib 页面包含在 Visual Studio 2010 中构建 QuantLib 的说明, http: //quantlib.org/install/vc10.shtml但我需要帮助来创建 SWIG 绑定。
Resolver Systems 具有适用于我的预构建 C# 绑定。 http://www.resolversystems.com/products/quantlib-binary/我可以用这个包在 C# 中运行 QuantLib 代码。我的问题是我需要在 QuantLib 代码中添加一个小功能,以便在我的 C# 项目中使用。这就是我需要重新构建 QuantLib 并重新创建 SWIG 绑定的原因。
我知道 QLNet,QuantLib 的 C# 端口,http://sourceforge.net/projects/qlnet/,但是这个项目缺少一些东西,我认为它不再被积极开发。具体来说,我需要能够为支付离散红利的期权定价。QLNet 缺少一些代码。我尝试将必要的代码从 QuantLib 移植到 QLNet,但我的 C++ 肯定生锈了,因为我得到了不正确的输出。
请注意,我需要添加到 QuantLib 的小功能是处理小数天的能力。我能够将此功能添加到 QLNet,这确实是一个小功能。这个微小的编辑延迟了我的项目。我将非常感谢有关此问题的帮助。