繁体   English   中英

类型之间的转换:C++ 到 C++/CLI

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM