我想向 QuantLib 添加一个小功能,并将其与 SWIG 绑定(bind)一起编译,以便在 Visual Studio 2010 中的 C# 项目中使用。但是,我几乎每次都会遇到问题。在 Visual Studio 2010 中构建 QuantLib、创建 SWIG 绑定(bind)以及构建 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 绑定(bind)
- 我将环境变量 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 目录包含在 header 目录中。
- 我将 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 绑定(bind)。
Resolver Systems 具有适合我的预构建 C# 绑定(bind)。 http://www.resolversystems.com/products/quantlib-binary/我能够使用这个包在 C# 中运行 QuantLib 代码。我的问题是,我需要向 QuantLib 代码添加一个小功能,以便在我的 C# 项目中使用。这就是我需要重新构建 QuantLib 并重新创建 SWIG 绑定(bind)的原因。
我了解 QLNet,QuantLib 的 C# 端口,http://sourceforge.net/projects/qlnet/ ,但是这个项目缺少一些部分,我认为它不再被积极开发。具体来说,我需要能够对支付离散股息的期权进行定价。 QLNet 缺少一些相关代码。我尝试将必要的代码从 QuantLib 移植到 QLNet,但我的 C++ 一定很生疏,因为我得到了不正确的输出。
请注意,我需要添加到 QuantLib 的小功能是处理小数天数的能力。我能够将此功能添加到 QLNet,这确实是一个小功能。这个微小的编辑推迟了我的项目。我非常感谢有关此问题的帮助。
最佳答案
SWIG 包装器作为分布式和 .Net 4.0 确实似乎存在问题。
我不在该平台上工作,所以我无法根据个人经验发言。然而,这个问题最近在 QuantLib 邮件列表上进行了讨论,据报道 Mark Gillis 在那里提供的解决方案有效。您可以阅读相关帖子http://thread.gmane.org/gmane.comp.finance.quantlib.user/8238 。希望这有帮助...
关于visual-studio-2010 - QuantLib+SWIG+C# 4.0+Visual Studio 2010 : TypeInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9824148/