2

我想向 QuantLib 添加一个小功能,并将其与 SWIG 绑定一起编译,以便在 Visual Studio 2010 中的 C# 项目中使用。但是,我几乎每一次都遇到问题。在 Visual Studio 2010 中构建 QuantLib、创建 SWIG 绑定和构建 C# 项目涉及哪些步骤?

  1. 我从http://sourceforge.net/projects/quantlib/files/下载了 QuantLib
  2. 我从http://sourceforge.net/projects/boost/files/boost/1.49.0/下载了 Boost
  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: 

请注意,我使用 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,这确实是一个小功能。这个微小的编辑延迟了我的项目。我将非常感谢有关此问题的帮助。

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

不久前,我为这个确切的错误消息而苦苦挣扎,并访问了这个页面,正如谷歌搜索可能会说的那样,“很多次”。

最后,我的错误是相当良性的,但我花了一些时间来解决它。

我使用 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++ 代码,但我不记得过程中的那个步骤。

一旦我弄清楚了(在另一台机器上运行代码并打开 VS 进行调试时,使用 StackOverflow 提示检查错误的“内部异常”),问题就消失了。

我有点无知,这花了我一点时间,但也为我赢得了一些经验:

对我来说,这个错误是由于没有将非托管(C++)库放在托管(C#)库可以找到它的地方。

于 2016-03-02T19:49:14.177 回答