AccessViolationException - При вызове Botan :: LibraryInitializer

Я создаю управляемую оболочку для Botan crypto в .NET и следую инструкциям по началу работы здесь

Начало работы

И справочник по библиотеке

Я пытаюсь сначала запустить LibraryInitializer, но когда я вызываю его, он выдает исключение AccessViolationException - внутри моего метода INIT ().

Мой код такой.

Тестовая программа C #

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BotanCrypto_ManagedWrapper;
using System.Numerics;

namespace TestBotanWrapper
{
    class Program
    {
        static void Main(string[] args)
        {
            BotanCrypto BC = new BotanCrypto();
            BC.INIT();


            UInt64 num = 100;

            BigInteger b = BC.Test(num);


            Console.WriteLine(b);
            Console.ReadKey();
        }
    }
}

Wrapper CPP

// This is the main DLL file.

#include "stdafx.h"

#include "BotanCrypto_ManagedWrapper.h"
using namespace BotanCrypto_ManagedWrapper;

void BotanCrypto::INIT(){
    LibraryInitializer init;

}

BigInteger BotanCrypto::Test(UInt64 x){
    //try{
        BigInt n = 1000000;
        x = 2;
    //}catch(SystemException^ ex){

    //  x = 0;
    //}
    return x;
}

Заголовок-оболочка

// BotanCrypto_ManagedWrapper.h

#pragma once

using namespace System;
using namespace Numerics;
using namespace Botan;

namespace BotanCrypto_ManagedWrapper {

    public ref class BotanCrypto
    {
        // TODO: Add your methods for this class here.
    public:
        BigInteger Test(UInt64 k);
        void INIT();
    };


}

Я даже не знаю, правильно ли я вызываю библиотечный инициализатор. Я не слишком знаком с C ++. Любая помощь приветствуется. благодаря.

ИЗМЕНИТЬ Я пробовал то же самое в приложении Win32 Console, но получил тот же результат

#include "stdafx.h"
#include <botan/botan.h>

int _tmain(int argc, _TCHAR* argv[])
{
   try
      {
      Botan::LibraryInitializer init;

      // ...
      }
   catch(std::exception& e)
      {
      //std::cerr << e.what() << "\n";
      }
    return 0;
}

Необработанное исключение в 0x0F12422E (botan.dll) в ConsoleApplication4.exe: 0xC0000005: место чтения нарушения прав доступа 0x003B0000.


person erotavlas    schedule 12.06.2015    source источник
comment
Я бы получил это в WinDbg и посмотрите, что загружено (или предположительно не загружается) в 0x003B0000. Если он находится в вашей DLL, вы сможете получить символ. Я думаю, что ваш другой вариант - включить отладку собственного кода в Visual Studio. Для этого см. Как: включить Отладка неуправляемого кода и Отладка неуправляемого кода при отладке управляемого кода.   -  person jww    schedule 12.06.2015
comment
Одна из причин - на этой странице упоминается, что время жизни LibraryInitializer должно превышать время жизни всех других объектов Botan. Это означает, что вы должны создать конструктор класса для своего класса BotanCrypto и поместить туда LibraryInitializer init. Ваш код просто создает и уничтожает, заправляя его в эту функцию INIT.   -  person sorrell    schedule 19.06.2015


Ответы (1)


Я бы поменял:

LibraryInitializer init;

to:

try
{
   LibraryInitializer init;
}
catch(std::exception& e)
{
    std::cerr << e.what() << "\n";
}

Как указано в разделе "подводные камни" на начальной странице.

person SteveFerg    schedule 12.06.2015