1

我已经在 Visual Studio 2010 中从他们的网站下载并构建了 QuantLib(在谷歌搜索 quantlib 并检查安装链接)。但是因为我对 C++ 的了解很少,所以我想使用 SWIG,所以我可以用 C# 调用 QuantLib 库。在 SWIG 转换后,我得到了正确的构建。我认为这会运行,但在运行时我在 C# 类中的多个位置收到以下错误:

检测到 PInvokeStackImbalance
调用 PInvoke 函数 'NQuantLib!QuantLib.NQuantLibcPINVOKE::new_Date__SWIG_1' 使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。

MDA 错误 MSDN

我认为这是一个普遍错误,所以请告诉我如何解决这个问题?

4

4 回答 4

1

请参阅http://www.resolversystems.com/products/quantlib-binary/了解 C# 的 QuantLib 的现成版本。

几分钟后我就启动并运行了。

于 2011-05-20T16:20:00.257 回答
1

这可能是某种版本不匹配。

首先:由于您使用的是 VC2010,我假设您使用的 QuantLib 和 QuantLib-SWIG 的版本是从 Subversion 签出的;这个对吗?

其次,您是否使用了 QuantLib 和 QuantLib-C# 中包含在结帐中的 VC2010 项目(文件名中带有 _vc10 的项目),或者您是否转换了其他项目?你在发布模式下编译了吗?如果您告诉它们,提供的 C# 示例是否从 IDE 运行?(他们是 EquityOption 和 BermudanSwaption 项目)

最后,您使用的是什么版本的 SWIG?

于 2010-12-13T11:12:26.970 回答
1

有关在其他语言和平台下使用 QuantLib 的详细信息,请前往quantlib 扩展页面

于 2012-01-10T05:55:54.467 回答
0

临时解决方法是在QuantLib_vc10解决方案中创建一个配置文件 ( App.config )并添加一个元素来抑制不平衡堆栈错误。NetFx40_PInvokeStackResilience

我创建了以下App.config文件并将其加载到BermudanSwaption_vc10EquityOption_vc10项目中。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <runtime>
        <NetFx40_PInvokeStackResilience enabled="1"/>
    </runtime>
</configuration>

然后这两个项目将正常工作,尽管可能会产生一些性能成本。

于 2012-02-12T06:10:27.033 回答