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