我试图编写一个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的回答)
答案 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。