2012-03-22 7 views
2

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

  1. Я скачал QuantLib из http://sourceforge.net/projects/quantlib/files/
  2. Я скачал подталкивание от 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. Я включил мое подталкивание и 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 в Кoнфигурировании. Я также попробовал это, используя конфигурацию Release. Это не сработало.

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

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

Резолюверные системы имеют встроенные привязки 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, и это действительно маленькая функция. Это крошечное редактирование задерживает мой проект. Я был бы очень признателен за помощь в этом вопросе.

+0

Щелкните правой кнопкой мыши по вашему проекту EXE, Properties, Build tab. Изменить целевую платформу платформы x86. Или создайте 64-битную версию вашего собственного кода и обертки. –

+0

Это сработало! Я установил целевую платформу NQuantLib_vc9, EquityOption_vc9 и BermudanSwaption_vc9 на x86. Я также установил для Target Framework (EXE-проекты, свойства, приложение) значение ".Net Framework 4 ". Я не думал об этом первоначально, хотя я преобразовал проект из Visual Studio 2008 в Visual Studio 2010. Спасибо святой Хансу и Луиджи :) – user1214135

ответ

2

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

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

0

Я немного искал это сообщение об ошибке и посещал эту страницу, поскольку поиск Google мог бы сказать «много раз».

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

Я использовал C# wrappers от SWIG для доступа к библиотеке QuantLib C++. Я использовал интеграцию ДНК Excel, чтобы сделать свой Quantlib.xll, и я также создал несколько .exe, которые получают доступ к Quantlib.

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

  1. Запуск .exes с моим рабочим столом («иногда»)
  2. Раздача моего Xll других пользователей (всегда).

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

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

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

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

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