2016-10-13 7 views
2

Я пытаюсь создать оболочку C++/CLI для Caffe для C#. Я сделал свой собственный проект классификации сверху на libcaffe. Проект классификации отлично работает при вызове из проекта консоли C++.AccessViolationException при вызове C++/CLI-оболочки Caffe

Я сделал пустую оболочку проекта, компилировать и может быть вызвана из C#

CaffeWrapper.h

#pragma once 
//#include "classification.h" 
namespace CaffeWrapper { 

public ref class Detector 
{ 
public: 
    Detector(System::String^ model_file, 
     System::String^ trained_file, 
     System::String^ label_file); 

private: 
    //Classifier * c; 

CaffeWrapper.cpp

#include "CaffeWrapper.h" 
#include <msclr\marshal_cppstd.h> 
namespace CaffeWrapper { 
Detector::Detector(System::String^ model_file, 
    System::String^ trained_file, 
    System::String^ label_file) 
{ 
    std::string unmanaged_model = 
     msclr::interop::marshal_as<std::string>(model_file); 
    std::string unmanaged_train = 
     msclr::interop::marshal_as<std::string> (trained_file); 
    std::string unmanaged_label = 
     msclr::interop::marshal_as<std::string>(label_file); 

    //c = new Classifier(unmanaged_model, unmanaged_train, unmanaged_label); 
} 

программы испытаний в C#

using System; 
using System.IO; 
using CaffeWrapper; 
namespace TestDetect 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string basePath = "C:/Caffe/TestClassify/"; 
      string model_file = basePath + "net.prototxt"; 
      string trained_file = basePath + "lenet_iter_20000.caffemodel"; 
      string label_file = basePath + "labels.txt"; 
      string imgfile = basePath + "imageTest.pgm"; 
      Console.WriteLine("test"); 
      var detecotr = new Detector(model_file, trained_file, label_file); 
     } 
    } 
} 

Когда я включить мой классификационный проект в моей обертке

#include "classification.h" 

Я получаю следующую ошибку при запуске:

Первый шанс исключение типа «System.AccessViolationException» произошло в mscorlib.dll Дополнительная информация: Попытанные для чтения или записи защищенной памяти. Это часто свидетельствует о том, что другая память повреждена.

Это не ошибка чтения или записи нераспределенной памяти? Как это можно получить при запуске? У вас есть решения для этой проблемы?

стек вызовов:

mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state)

mscorlib.dll System.Threading.ThreadHelper.ThreadStart()

EDIT: Там, кажется, какая-то проблема с ссылками на .NET в моей обертке. Ссылка на систему имела красное восклицание. Я удалил его, и теперь, когда я пытаюсь его добавить, я получаю ошибку: ошибка HRESULT E_FAIL была возвращена из вызова COM-компонента.

+0

Вы хотите называть C++ на языке C#? или наоборот? – Matt

+1

Это происходит очень быстро, даже до того, как начнется запуск кода на C#. Обратите внимание, что Main() не находится в трассировке стека. Триггер - это дрожание, загружающее вашу сборку C++/CLI, которая, в свою очередь, получает собственный код для инициализации. Статические ошибки инициализации на C++ очень трудно диагностировать, печально известная проблема «статического инициализации порядка» на C++ может испортить вам неделю. Важным первым шагом является включение неуправляемой отладки, чтобы вы, по крайней мере, имели * что-то *, чтобы посмотреть. –

+0

@Matt Я хочу называть C++ –

ответ

0

AccessViolationException обычно предлагает попытку использовать указатель нулевого C++ В стеке вызовов также говорится, что проблема связана со статическим инициализатором, а не с выполнением основной процедуры - я не знаю о кофе, но я бы посмотрел на статику в классификации.h (или одной из его зависимостей) и проверьте, что выполняется действительная инициализация

+0

Но разве я не получаю такой же крах, когда тестирую его с C++? –

Смежные вопросы