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