将 List 从 c++ 传递到 C#
本文关键字:c++ List String | 更新日期: 2023-09-27 18:17:57
没有使用c ++的经验,所以在这里请求一些帮助。我得到的是一个.net dll,我正在编写一个包装器,以便以后可以在c ++和vb6项目中使用.net dll。
到目前为止我的代码:
我想调用的 c# 类:
public class App
{
public App(int programKey, List<string> filePaths)
{
//Do something
}
}
我的 C++ 项目:
static int m_programKey;
static vector<std::string> m_fileNames;
void __stdcall TicketReportAPI::TrStart(int iProgramKey)
{
m_programKey = iProgramKey;
};
void __stdcall TicketReportAPI::TrAddFile(const char* cFileName)
{
string filename(cFileName);
m_fileNames.push_back(filename);
}
void __stdcall TicketReportAPI::TrOpenDialog()
{
if(m_fileNames.size()> 0)
{
List<String^> list = gcnew List<String^>();
for(int index = 0; index < m_fileNames.size(); index++)
{
std::string Model(m_fileNames[index]);
String^ sharpString = gcnew String(Model.c_str());
list.Add(gcnew String(sharpString));
}
App^ app = gcnew App(m_programKey, list);
}
else
App^ app = gcnew App(m_programKey);
}
如果我尝试编译c ++项目,则出现以下错误:
App(int,System::Collections::Generic::List ^(':无法从"System::Collections::Generic::List"转换为"System::Collections::Generic::List ^">
是否可以将托管列表从 c++ 传递到 .net c#?如果没有,你们建议我将字符串数组传递给我的 c# 程序集吗?
感谢每一个帮助,提前感谢。
你缺少一个^
。
List<String^>^ list = gcnew List<String^>();
^-- right here
您还需要list.Add
切换到 list->Add
。
您使用的是 gcnew
,这是您在托管堆上创建内容的方式,生成的类型是托管句柄 ^
。这大致相当于使用 new
在非托管堆上创建对象,结果类型是指针 *
。
声明 List<String^>
类型的局部变量(不带 ^
(在 C++/CLI 有效:它使局部变量使用堆栈语义。没有与该变量类型等效的 C# ,因此大多数 .Net 库都不能完全使用它:例如,没有复制构造函数来处理没有^
变量的赋值。所有托管 API 都需要具有具有 ^
的类型的参数,因此大多数时候,您需要将其用于局部变量。
重要说明:本答案中的所有内容都适用于 .Net 中的引用类型(在 C# 中声明为 class
,或在 C++/CLI 中声明为 ref class
或 ref struct
(。它不适用于值类型(C# struct
、C++/CLI value class
或value struct
(。值类型(如int
、float
、DateTime
等(总是在没有^
的情况下声明和传递。