[英]Conversion between types: C++ to C++/CLI
我正在尝试将 C++ 库包装到 C++/CLI 库中以在 C# 中使用。 我在类型之间转换时遇到问题...
C++ 函数看起来像这样(这是来自 MyCppLib.h 文件,我无法更改 C++ 代码):
int CppFunc(void* Handle, wchar_t* Feature, long long* Value)
我的 C++/CLI 包装函数如下所示:
#include "MyCppLib.h"
#include <msclr\marshal.h>
#include <string.h>
#include <stdlib.h>
using namespace System;
using namespace System::Runtime::InteropServices;
using namespace msclr::interop;
namespace MyCppCliLib
{
int CppCliFunc(IntPtr Handle, String^ Feature, long long* Value) {
return ::CppFunc(Handle.ToPointer(), string_to_wchar(Feature), Value);
}
static wchar_t* string_to_wchar(String^ managedString)
{
marshal_context^ context = gcnew marshal_context();
wchar_t* unmanagedString = context -> marshal_as<wchar_t*>(managedString);
delete context;
return unmanagedString;
}
}
但是,似乎我无法将 String^ 编组为 wchar_t* ... 错误 C2065 说“不支持此转换”。 虽然如果我用const wchar_t*
替换它,它似乎有效......我不明白......而且我不确定我是否正确转换了 Handle 和 Value 类型......
如何将 C++ void*、wchar_t* 和 long long* 类型转换为 C++/CLI?
marshal_context
类是本机类型,而不是垃圾收集类型。 所以你不能写gcnew marshal_context()
预期用途如下:
marshal_context context;
const wchar_t* unmanagedString = context.marshal_as<const wchar_t*>(managedString);
// use unmanagedString
// when context goes out of scope, both the context object and the memory for unmanagedString are freed
但是你有一个问题,你想返回一个指针。 您的问题或代码中没有任何关于string_to_wchar
与其调用者之间关于最终应如何释放内存的合同的任何内容。 我们可以通过注意到您的辅助函数太短而无法使用来避免这个问题,因此您可以消除它:
#include <msclr\marshal.h>
int CppCliFunc(IntPtr Handle, String^ Feature, long long* Value)
{
marshal_context context;
return ::CppFunc(Handle.ToPointer(),
context.marshal_as<const wchar*>(Feature),
Value);
}
现在字符串数据在::CppFunc
需要它时仍然存在。
但是,您需要一个非const
指针。 System::String^
意味着是不可变的(实际上并非如此,这会导致一些问题),因此marshal_as
库会阻止您获得可写指针。 但是,您可以轻松获得指向字符串副本的可写指针:
#include <msclr\marshal_cppstd.h>
int CppCliFunc(IntPtr Handle, String^ Feature, long long* Value)
{
std::wstring strFeature{marshal_as<std::wstring>(Feature)};
return ::CppFunc(Handle.ToPointer(),
&stdFeature[0],
Value);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.