C++ cli 简单转换C++/CLI int^到非托管int*

C++ cli 简单转换C++/CLI int^到非托管int*,c++-cli,native,managed,C++ Cli,Native,Managed,这是如此基本,应该很容易找到。在我的搜索中,我得到的只是更复杂的解决方案。转换字符串、封送、固定对象。如何简单地将c++/CLI int^指针转换为c++/CLI中的本机int* 我的职责是 void Open(int ^Hndl) { void Unmanaged_Open(Hndl); // How do you pass the pointer to this } 在哪里 无效非托管_打开(int*handle) 下面是如何在C++/CLI中实现输出参数,如C#的void fun

这是如此基本,应该很容易找到。在我的搜索中,我得到的只是更复杂的解决方案。转换字符串、封送、固定对象。如何简单地将c++/CLI int^指针转换为c++/CLI中的本机int*

我的职责是

void Open(int ^Hndl)
{
    void Unmanaged_Open(Hndl); // How do you pass the pointer to this
}
在哪里
无效非托管_打开(int*handle)

下面是如何在C++/CLI中实现输出参数,如C#的
void func(out int x)
。请注意,没有
int^

void Open([OutAttribute] int% retval)
{
    int result;
    if (!UnmanagedOpen(&result))
         throw gcnew Exception("Open failed!");
    retval = result;
}
请注意,只返回值可能更好。当返回值用于错误检查时,Out参数大多数出现在本机函数中。您可以使用.NET中的异常进行错误检查,如下所示:

int Open()
{
    int result;
    if (!UnmanagedOpen(&result))
         throw gcnew Exception("Open failed!");
    return result;
}
或者,如果预期会失败(例如,不受信任的输入),则实现TryXYZ模式():


没用,但谢谢你,佩珀·奇科。。。我还在网上寻找答案,抱歉,我想我把事情搞砸了。您应该输入一个int变量,然后输入&variable。比如:
intvar=*Hndl;非托管_打开(&var)我明白了,取消引用c++/CLI指针并使用对非托管方法的引用。它成功地让编译器停止嘎嘎作响。谢谢。为什么要使用
int^
?使用值类型的盒式句柄在C++/CLI中是一种代码味道。嗨,Ben,我不确定我是否理解您的问题。我在写包装纸。C++ API有一个指针,给int返回给句柄。我需要一些如何将这个int引用从C++到C++到CLI。我认为“^”相当于c++/CLI中的指针。在
false
的情况下保持
retval
不变不是常规做法吗?当然,我会将其值记录为未指定的值,而不是确定不变的值,但为了避免可能出现不必要的写入…@LightnessRacesinOrbit:no,在TryXYZ设计模式中,通过引用传递的参数在离开函数时被明确指定。(如果您保留了旧值,C++/CLI编译器不会抱怨,但C#编译器会生成一个错误。)天哪,这太可怕了:(@LightnessRacesinOrbit:如果你知道原因,那就不太可怕了。它允许在函数调用中检测未初始化变量的使用。如果函数正常退出,C#中的所有引用参数都必须被明确指定——如果使用了
ref
关键字,则在调用发生时它已经被明确指定,如果使用
out
关键字,函数负责在返回之前分配它。C++/CLI不强制执行此操作,但在罗马…感谢您的回答Ben。我没有想到在函数中创建对象并分配返回值。这是一项如此基本的任务,我无法轻松找到引用。我注意到我吃得很饱。
bool TryOpen([OutAttribute] int% retval)
{
    retval = 0;
    int result;
    if (!UnmanagedOpen(&result)) return false;
    retval = result;
    return true;
}