我正在尝试为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组件返回。
答案 0 :(得分:0)
AccessViolationException通常建议尝试使用null c ++指针 调用堆栈进一步表明问题是使用静态初始化器而不是执行主程序 - 我不知道caffe但是我会查看classification.h(或其中一个依赖项)中的静态并检查正在进行有效的初始化