C# 调用C++/中国咖啡馆

C# 调用C++/中国咖啡馆,c#,c++,c++-cli,wrapper,caffe,C#,C++,C++ Cli,Wrapper,Caffe,我正在尝试为Caffe到C#制作一个C++/CLI包装器。我在libcaffe上做了自己的分类项目。分类项目在C++控制台项目中被完美地调用。 我制作了一个空的包装器项目,它可以编译并从c调用# 咖啡包装纸 #pragma once //#include "classification.h" namespace CaffeWrapper { public ref class Detector { public: Detector(System::String^ model_fil

我正在尝试为Caffe到C#制作一个C++/CLI包装器。我在libcaffe上做了自己的分类项目。分类项目在C++控制台项目中被完美地调用。 我制作了一个空的包装器项目,它可以编译并从c调用#

咖啡包装纸

#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);
}
当我在包装器中包含分类项目时

#include "classification.h"
我在启动时遇到以下错误:

mscorlib.dll中发生类型为“System.AccessViolationException”的第一次意外异常 其他信息:尝试读取或写入受保护内存。这通常表示其他内存已损坏

这不是读取或写入未分配内存的错误吗?如何在启动时获得此功能?你有解决这个问题的办法吗

调用堆栈:

mscorlib.dll!System.AppDomain.ExecuteAssembly(字符串汇编文件,System.Security.Policy.Evidence assemblySecurity,字符串[]args) Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态,bool preserveSyncCtx)
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext ExecutionContext,System.Threading.ContextCallback回调,对象状态)

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

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

Access Read Exchange通常建议使用一个空C++指针。


调用堆栈进一步表明问题是用静态初始化器来执行主程序,而我不知道CAFE,但我会查看分类中的静态。H(或者它的一个依赖项),并检查正在执行的有效初始化:< /P>您想调用C代码中的本机C++吗?或者相反?这种情况很早就发生了,甚至在你的C代码开始运行之前。注意Main()如何不在堆栈跟踪中。触发器是加载C++/CLI程序集时产生的抖动,这反过来又会使本机代码自行初始化。C++中的静态初始化错误很难诊断,C++中的“静态初始化顺序FASCO”问题会毁了你一个星期的生活。一个重要的第一步是启用非托管调试,这样你至少有一些东西要看。@ MATT我想调用C++@ BJORN,那么你不需要一个C++/CLI包装器,你可以使用pNoCKEY,但是当我从C++测试时,我不会得到同样的崩溃吗?
#include "classification.h"