调用Caffe的{C ++ / CLI包装器时

时间:2016-10-13 14:11:27

标签: c# c++ c++-cli wrapper caffe

我正在尝试为Caffe创建一个C ++ / CLI包装器到c#。我已经在libcaffe上创建了自己的分类项目。从c ++控制台项目调用时,分类项目可以很好地工作。

我创建了一个可以编译的空包装器项目,可以从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"

我在启动时遇到以下错误:

类型&#39; System.AccessViolationException&#39;的第一次机会异常。发生在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()

编辑: 在我的包装器中对.NET的引用似乎存在一些问题。对系统的引用有一个红色感叹号。我删除它,现在当我尝试添加它时,我收到错误:错误HRESULT E_FAIL已从调用COM组件返回。

1 个答案:

答案 0 :(得分:0)

AccessViolationException通常建议尝试使用null c ++指针 调用堆栈进一步表明问题是使用静态初始化器而不是执行主程序 - 我不知道caffe但是我会查看classification.h(或其中一个依赖项)中的静态并检查正在进行有效的初始化