Visual C ++ DLL错误C2039尝试在Windows运行时类型上调用Close()

时间:2017-11-17 21:13:40

标签: visual-c++ dll win-universal-app windows-10-universal c++-cx

我试图编写一个DLL来访问来自C#应用程序的C ++方法Windows.Devices.Bluetooth.BluetoothLEDevice.Close()。我似乎能够访问该类,但如果我尝试使用那个方法,Visual Studio将无法构建。它显示在您键入的成员列表中,并且没有Intellisense错误,只有构建错误。

using namespace Windows::Devices::Bluetooth;

__declspec(dllexport) void CloseBleDeviceUnmanaged(BluetoothLEDevice^device)
{
    if (device->ConnectionStatus == BluetoothConnectionStatus::Connected) //no complaints for a property
    {
        device->GetDeviceSelector(); //no complaints for a method either
        device->Close(); //Error C2039 | 'Close': is not a member of 'Windows::Devices::Bluetooth::BluetoothLEDevice'
    }

    return;
}

如何至少构建这个?

(编辑:删除了无关的语法问题,根据Nico Zhu - MSFT的回答)

2 个答案:

答案 0 :(得分:0)

在您的情况下,CloseBleDeviceUnmanaged方法的参数为Value Type。将参数传递给方法时。该参数将生成一个副本。并且原始参数未更改。请通过 参考类型参数如下。

void DevicesTool::CloseBleDeviceUnmanaged(Windows::Devices::Bluetooth::BluetoothLEDevice^device)
{
    if (device->ConnectionStatus == BluetoothConnectionStatus::Connected)
    {
        device->GetDeviceSelector();
        device->Close();
    }
}

至于Close方法,我已经在我这边复制了这个问题(目标平台版本16299),我已经向相关团队报告了这个问题。请注意线程更新。

答案 1 :(得分:0)

您不需要执行任何操作即可从C#调用Close - 只需将其放入using(...)块中,它就会自动为您配置(关闭)该对象。如果异议的生命周期不适合using阻止,您只需直接在其上调用IDisposabe.Dispose()即可。

对于编译器错误,这是documented in MSDN,因为你永远不应该从C ++ / CX调用Close

  

Close方法无法通过Visual C ++组件扩展(C ++ / CX)在类运行IClosable的Windows运行时类实例上调用。相反,运行时类的Visual C ++组件扩展(C ++ / CX)代码应该调用析构函数或将最后一个引用设置为null。