Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调用C++;函数从C获取向量调用# 我在C++中工作,创建数据库来分析数据。我创建了几个具有C++向量功能的类。现在我想在C#中创建UI并调用这些类。我正在考虑创建从C#调用的API_C#_C++_.net - Fatal编程技术网

如何调用C++;函数从C获取向量调用# 我在C++中工作,创建数据库来分析数据。我创建了几个具有C++向量功能的类。现在我想在C#中创建UI并调用这些类。我正在考虑创建从C#调用的API

如何调用C++;函数从C获取向量调用# 我在C++中工作,创建数据库来分析数据。我创建了几个具有C++向量功能的类。现在我想在C#中创建UI并调用这些类。我正在考虑创建从C#调用的API,c#,c++,.net,C#,C++,.net,既然数据是数组/向量,那么我如何从C#调用它?我本想对此发表评论,但我的代表级别不够高。当使用C++类类库时,使用STL类(例如向量或字符串)会出现一些并发症。您可以在此处查看更多信息和可能的解决方案:您需要创建自己的C++/CLI互操作来实现这一点 强烈推荐Marcus Heege的一本好书“Expert C++/CLI”,读起来不错 以下是我的简单示例: // Program.cs static void Main(string[] args) { List<string>

既然数据是数组/向量,那么我如何从C#调用它?

我本想对此发表评论,但我的代表级别不够高。当使用C++类类库时,使用STL类(例如向量或字符串)会出现一些并发症。您可以在此处查看更多信息和可能的解决方案:

您需要创建自己的C++/CLI互操作来实现这一点

强烈推荐Marcus Heege的一本好书“Expert C++/CLI”,读起来不错

以下是我的简单示例:

// Program.cs
static void Main(string[] args)
{
    List<string> someStringList = new List<string>();
    someStringList.Add("Betty");
    someStringList.Add("Davis");
    someStringList.Add("Eyes");

    NativeClassInterop nativeClass = new NativeClassInterop();
    string testString = nativeClass.StringCat(someStringList);
}

// NativeClass.h, skipping this, it's obvious anyways

// NativeClass.cpp, normal C++ class, this was in some DLL project, don't need exports
#include "stdafx.h"
#include "NativeClass.h"
std::string NativeClass::StringCat(std::vector<std::string> stringList)
{
    std::string result = "";
    for(unsigned int i = 0; i < stringList.size(); i++)
    {
        if(i != 0)
        {
            result += " ";
        }
        result += stringList[i];
    }
    return result;
}

// NativeClassInterop.cpp, in same DLL project, but compile this file with /clr switch
#include <gcroot.h>
#using <System.dll>
#include <vector>
#include <string>
#include "NativeClass.h"

// Helper method
static std::string nativeStringFromManaged(System::String^ str)
{
    System::IntPtr hGlobal =
        System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str);

    std::string nativeString((hGlobal.ToPointer() == 0) 
        ? "" : (char*)hGlobal.ToPointer());

    System::Runtime::InteropServices::Marshal::FreeHGlobal(hGlobal);
    return nativeString;
}

// C++/CLI wrapper class
public ref class NativeClassInterop
{
public:
    System::String^ StringCat(System::Collections::Generic::List<System::String^>^ someStringList)
    {
        // You get to do the marshalling for the inputs
        std::vector<std::string> stringList;
        for(int i = 0; i < someStringList->Count; i++)
        {
            stringList.push_back(nativeStringFromManaged(someStringList[i]));
        }

        NativeClass nativeClass;
        std::string nativeString = nativeClass.StringCat(stringList);

        // And for the outputs ;-)
        System::String^ managedString = gcnew System::String(nativeString.c_str());
        return managedString;
    }
};
//Program.cs
静态void Main(字符串[]参数)
{
List someStringList=新列表();
添加(“贝蒂”);
添加(“Davis”);
添加(“眼睛”);
NativeClassInterop nativeClass=新的NativeClassInterop();
string testString=nativeClass.StringCat(someStringList);
}
//NativeClass.h,跳过这个,不管怎么说都很明显
/NATEVECLAS.CPP,普通C++类,这是在DLL的一些项目,不需要出口
#包括“stdafx.h”
#包括“NativeClass.h”
std::string NativeClass::StringCat(std::vector stringList)
{
std::string result=“”;
for(无符号int i=0;iCount;i++)
{
stringList.push_back(nativeStringFromManaged(someStringList[i]);
}
NativeClass NativeClass;
std::string nativeString=nativeClass.StringCat(stringList);
//对于输出;-)
System::String^managedString=gcnew System::String(nativeString.c_str());
退货管理;
}
};

当你说C++向量时你在谈论<代码> STD::向量< /代码>,那么互操作性是一个“高级话题”,但是你想要的是绝对可能的。诀窍是在非托管C++ CLUDE上创建一个“托管包装”,可以使用C++ + CLI使用IJW(或者,如果您有C样式调用,直接使用/p援引链接到DLL)。[我使用STD::vector,在类中,他们大量使用Boost库。另一种选择是在COM接口中封装C++库,然后从C添加它作为引用,互操作层自动生成。