C++ C+中的long^到long*转换+/CLI

C++ C+中的long^到long*转换+/CLI,c++,dll,c++-cli,wrapper,C++,Dll,C++ Cli,Wrapper,我有一个DLL,我需要写一个包装。我们的目标是在C#.NET应用程序中使用它,所以我需要使用C++/CLI(以前从未读过,所以我是新手) dll中的函数头如下所示: extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort); 我在包装器中定义的标题如下: 据我所知,circunflex符号(^)表示指向参数(nPort)的指针。因此,我试图编写以下代码,但我得到了一个转换错误错误C2664'BOOL

我有一个DLL,我需要写一个包装。我们的目标是在C#.NET应用程序中使用它,所以我需要使用C++/CLI(以前从未读过,所以我是新手)

dll中的函数头如下所示:

extern "C" __declspec(dllexport) BOOL __stdcall PlayM4_GetPort(LONG* nPort);
我在包装器中定义的标题如下:

据我所知,circunflex符号(^)表示指向参数(
nPort
)的指针。因此,我试图编写以下代码,但我得到了一个转换错误
错误C2664'BOOL(LONG*)':el argumento 1 no puede convertirse de'System::Int32^'a'LONG*'

bool PlayM4Wrapper::GetPort(长^nPort)
{
BOOL ret=\u mLoader->m\u PlayM4GetPort(nPort);
返回静态_-cast(ret);
}
有人能帮我吗?我应该如何编写这个包装器函数

谢谢

据我所知,circunflex符号(^)意味着它是指向参数的指针

不在C++的指针理解中。是的,它是对对象实例的引用。但是这个引用是你在C++中所不能使用的。它不是指针,您不能将其用作指针。首先,.NET中的

long
不是,所以您不需要它。但是从你的方法签名来看,我猜它被用作一个隐藏的返回值,所以你需要写入它,因此确实需要一个引用。由于它不是.NET中的引用类型,因此需要另一个修饰符才能将值传回:

// equivalent C# signature:
// bool GetPort(ref long nPort) 

bool PlayM4Wrapper::GetPort(long% nPort) 
{
    LONG local = nPort;

    if(_mLoader->m_PlayM4GetPort(&local))
    {
        nPort = local;
        return true;
    }

    return false;
}

相应地,
%
被称为a

我认为,
^
意味着对gc管理对象的引用,在本例中,该对象被长框括起来。因此,您可能应该使用正规局部变量
::LONG lport;如果(FALSE!=\u mLoader->m\u PlayM4GetPort(&lport)){nPort=lport;return true;}否则{nPort=0;return FALSE;}
它将以这种方式编译,这很好。但它现在在DLL中抛出System.AccessViolationException:(.这可能与最后一个错误有关吗?调用此函数时,可能您没有分配
nPort
对象?请注意,在这种情况下更改函数签名仍然有意义。获取错误的返回值几乎是不应该传递的。没有端口,接下来发生的任何事情都不会起作用。所以抛出一个异常。
bool PlayM4Wrapper::GetPort(long^ nPort)
{
    BOOL ret =_mLoader->m_PlayM4GetPort(nPort);
    return static_cast<BOOL>(ret);
}
// equivalent C# signature:
// bool GetPort(ref long nPort) 

bool PlayM4Wrapper::GetPort(long% nPort) 
{
    LONG local = nPort;

    if(_mLoader->m_PlayM4GetPort(&local))
    {
        nPort = local;
        return true;
    }

    return false;
}