gpt4 book ai didi

c# - 如何从 C# 中的 C++ dll 获取数组的内容

转载 作者:行者123 更新时间:2023-12-03 11:15:00 24 4
gpt4 key购买 nike

我想在 C++ 和 C# 中使用 DLL 中的函数。

我将字符串数据存储在 vector 中。

我的 C++ 文件包含:

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

extern "C" __declspec(dllexport) std::vector<std::string> GetProduct();

std::vector<std::string> GetProduct()
{
std::vector<std::string> vectProduct;
vectProduct.push_back("Citroen");
vectProduct.push_back("C5");
vectProduct.push_back("MOP-C5");
return vectProduct;
}

在 C# 中

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.InteropServices;
namespace ConsoleApplication
{
class Program
{
[DllImport("ProductLibrary.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern StringBuilder GetProduct();

static void Main(string[] args)
{
StringBuilder vectProduct_impl = GetProduct();
}
}
}

我不知道如何在c#中继续浏览数组。我不知道使用 vector 是否最佳。如果您有其他解决方案,我准备好了。

请帮忙。

最佳答案

我最喜欢的传递字符串数组 C++-->C# 的方式是使用委托(delegate)。

C#:

// If possible use UnmanagedType.LPUTF8Str
// or under Windows rewrite everything to use
// wchar_t, std::wstring and UnmanagedType.LPWStr
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void AddAnsi([MarshalAs(UnmanagedType.LPStr)] string str);

[DllImport("CPlusPlusSide.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void TestReturnArrayStrings(AddAnsi add);

然后

var lst = new List<string>();

TestReturnArrayStrings(lst.Add);

foreach (string str in lst)
{
Console.WriteLine(str);
}

还有 C++:

#include <string>
#include <vector>

extern "C"
{
__declspec(dllexport) void TestReturnArrayStrings(void (add)(const char* pstr))
{
std::string str1 = "Hello";
std::string str2 = "World";

add(str1.data());
add(str2.data());

// Example with std::vector

add("--separator--"); // You can even use C strings

std::vector<std::string> v = { "Foo", "Bar" };

// for (std::vector<std::string>::iterator it = v.begin(); it != v.end(); ++it)
for (std::vector<std::string>::const_iterator it = v.begin(); it != v.end(); ++it)
{
add(it->data());
}

add("--separator--"); // You can even use C strings

// With C++ 11

// for (auto& it: v)
for (const auto& it: v)
{
add(it.data());
}
}
}

这里的“技巧”是 C# 将一个委托(delegate)传递给 C++ 到 List<string>.Add()方法,而 C++ 直接“填充” C# List<> . C++管理的内存留在C++端,C#管理的内存留在C#端。没有跨内存所有权的问题。可以想象,很容易将“技巧”扩展到任何其他 .Add()方法,例如 HashSet<string> , 或 Dictionary<string, string> .

作为旁注,我创建了一个 github有许多关于 C/C++ 和 C#(.NET Framework 和 .NET Core/5.0)之间编码的示例。

关于c# - 如何从 C# 中的 C++ dll 获取数组的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65600207/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com