QuantLib+SWIG+C# 4.0+Visual Studio 2010: исключение TypeInitializationException

Я хотел бы добавить небольшую функцию в QuantLib и скомпилировать ее вместе с привязками SWIG для использования в проекте C# в Visual Studio 2010. Однако у меня возникают проблемы почти на каждом шагу. Какие шаги предпринимаются при создании QuantLib в Visual Studio 2010, создании привязок SWIG и создании проекта C#?

  1. Я скачал QuantLib с http://sourceforge.net/projects/quantlib/files/
  2. Я скачал Boost с http://sourceforge.net/projects/boost/files/boost/1.49.0/
  3. Я скачал привязки QuantLib+SWIG с http://sourceforge.net/projects/quantlib/files/QuantLib/1.0/bindings/QuantLib-SWIG-1.0.zip/download
  4. Я установил переменную среды QL_DIR в "C:\pathToFolder\QuantLib-1.2\lib" (компьютер> свойства> дополнительные параметры системы> дополнительные> переменные среды)
  5. Я запустил файл swig.cmd, расположенный в C:\pathToFolder\QuantLib-SWIG-1.0\CSharp
  6. Я открыл QuantLib_vc9.sln в Visual Studio 2010
  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: 

Обратите внимание, что я построил все с настройкой отладки. Я также попробовал это, используя конфигурацию выпуска. Это не сработало.

Хотелось бы найти полный набор инструкций, подробно описывающих, как создать проект такого типа. Я нашел некоторые инструкции здесь, Компилируя Quantlib через SWIG для C#, но я не мог заставить это работать.

Страница QuantLib содержит инструкции по созданию QuantLib в Visual Studio 2010, http://quantlib.org/install/vc10.shtml но мне нужна помощь в создании привязок SWIG.

Resolver Systems имеет готовые привязки C#, которые работают для меня. http://www.resolversystems.com/products/quantlib-binary/ Мне удалось запустить код QuantLib на C#, но этот пакет прекрасно работал. Моя проблема в том, что мне нужно добавить небольшую функцию в код QuantLib для использования в моем проекте на C#. Это причина, по которой мне нужно пересобрать QuantLib и воссоздать привязки SWIG.

Я знаю о QLNet, C#-порте QuantLib, http://sourceforge.net/projects/qlnet/, но в этом проекте отсутствуют некоторые фрагменты, и я думаю, что он больше не разрабатывается активно. В частности, мне нужно иметь возможность оценивать опционы, которые платят дискретные дивиденды. В QLNet отсутствует часть кода для этого. Я попытался перенести необходимый код из QuantLib в QLNet, но мой C++ должен быть ржавым, потому что я получаю неправильный вывод.

Обратите внимание, что небольшая функция, которую мне нужно добавить в QuantLib, - это возможность обрабатывать дробные дни. Мне удалось добавить эту функцию в QLNet, и это действительно небольшая функция. Это крошечное редактирование задерживает мой проект. Я был бы очень признателен за помощь в этом вопросе.

2 ответа

Решение

Кажется, действительно существует проблема с распространяемыми оболочками SWIG и.Net 4.0.

Я не работаю на этой платформе, поэтому я не могу говорить на основе личного опыта. Тем не менее, эта проблема недавно обсуждалась в списке рассылки QuantLib, и сообщалось, что решение, предложенное Марком Гиллисом, сработало. Вы можете прочитать соответствующую ветку на http://thread.gmane.org/gmane.comp.finance.quantlib.user/8238. Надеюсь это поможет...

Некоторое время назад я боролся с этим точным сообщением об ошибке и посещал эту страницу, как мог бы сказать поиск Google, "много раз".

В конце концов, моя ошибка была довольно мягкой, но мне потребовалось время, чтобы разобраться с ней.

Я использовал оболочки C# от SWIG для доступа к библиотеке QuantLib C++. Я использовал Excel DNA Integration для создания своего Quantlib.xll, а также создал несколько.exes, которые обращаются к Quantlib.

Различные ситуации могут привести к появлению этой ошибки, особенно

  1. Запуск.exes с моего рабочего стола ("иногда")
  2. Распространение моего XLL другим пользователям (всегда).

В итоге я обнаружил, что дистрибутив, который я получал из папки bin моих проектов VS2010 (и 12, 13, 15), включал NQuantLib (код оболочки C#), но не включал NQuantLibc (неуправляемый код C++, называемый),

XLL и exes иногда работали на моей машине, потому что я, вероятно, помог им (изменив мой путь?) Найти недостающий код C++, но я не вспомнил этот шаг в процессе.

Как только я понял это (используя подсказку Stackru, чтобы проверить "внутреннее исключение" ошибки при запуске кода на другом компьютере и открытии VS для отладки при его бомбардировке), проблема ушла.

Немного невежества с моей стороны, которое стоило мне немного времени, но принесло мне немного опыта:

эта ошибка, для меня, была вызвана тем, что не поместил неуправляемую (C++) библиотеку туда, где ее могла найти управляемая (C#) библиотека.

Другие вопросы по тегам