visual-studio-2010 - QuantLib+SWIG+C# 4.0+Visual Studio 2010 : TypeInitializationException

标签 visual-studio-2010 c#-4.0 quantlib quantlib-swig

我想向 QuantLib 添加一个小功能,并将其与 SWIG 绑定(bind)一起编译,以便在 Visual Studio 2010 中的 C# 项目中使用。但是,我几乎每次都会遇到问题。在 Visual Studio 2010 中构建 QuantLib、创建 SWIG 绑定(bind)以及构建 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 绑定(bind)
  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 目录包含在 header 目录中。
    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 绑定(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/

相关文章:

asp.net - Visual Studio 2010 图表控件 : Make Y Axis an Integer value, 不是十进制

vb.net - Visual Basic try catch 未捕获的重复键

c# - 通过 SWIG 将 Quantlib 和另一个库公开给 C#

c++ - Quantlib 求解器未产生与 BondFunctions::yield 相同的到期 yield

c# - 在 MVC View 中为 HTML DropDownList 创建标签和值

c++ - 赛格温 : Installing quantlib in cygwin

regex - 正则表达式搜索,排除一个词

c# - 如何从 GridView 中删除时间戳

asp.net - 如何在asp.net中以编程方式编辑gridview?

c# - 访问 ControlTemplate 中的控件