我正在尝试使用Native WiFi(https://managedwifi.codeplex.com/)创建并连接到WLAN配置文件。我能够查看所有网络BSS列表及其参数。但是,当我尝试创建/覆盖WLAN配置文件时,我收到以下提到的错误消息(错误#1):
ManagedWifi.dll发生了未处理的“System.ComponentModel.Win32Exception”类型异常。
其他信息:网络连接配置文件已损坏
但是,当我通常从Windows 7控制面板的“网络和共享中心”创建配置文件,然后尝试使用ManagedWiFi进行连接时,我收到另一条错误消息(错误#2):
mscorlib.dll中出现未处理的“System.ArgumentException”类型异常
附加信息:类型'NativeWifi.Wlan + WlanReasonCode'不能作为非托管结构封送;没有有意义的大小或偏移量可以计算出来。
我注意到即使我尝试从“网络和共享中心”连接/断开WLAN配置文件,并且Windows应用程序在后台运行,也会发生此错误。
以下是我使用的示例代码:
Dim profileName As String = GlobalVariables.ssidname ' Provides the selected SSID name from the Network BSS List
Dim hexval As String = StringToHex(GlobalVariables.ssidname) ' Function to get the hexadecimal value for a provided string
Dim key As String = TextBox1.Text ' Security key from the textbook provided
Dim profileXml As String = String.Format("<?xml version=""1.0""?><WLANProfile xmlns=""http://www.microsoft.com/networking/WLAN/profile/v1""><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>networkKey</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey><keyIndex>0</keyIndex></security></MSM></WLANProfile>", 'GlobalVariables.ssidname, hexval, TextBox1.Text)
wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, True) 'Error#1 occurs here
wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName) 'Error#2 occurs here
在论坛“Type Native Wifi.Wlan + WlanReasonCode cannot be marshaled error”中,问题(错误#2)似乎在WlanAPI.cs中,其中有一行代码检查返回代码的大小。这是一行:
int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));
if (notifyData.dataSize >= expectedSize)
{
Wlan.WlanReasonCode reasonCode = (Wlan.WlanReasonCode)Marshal.ReadInt32(notifyData.dataPtr);
if (wlanIface != null)
wlanIface.OnWlanReason(notifyData, reasonCode);
}
将上述代码更改为以下似乎可以解决问题。
//int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));
if (notifyData.dataSize >= 0)
{
Wlan.WlanReasonCode reasonCode = (Wlan.WlanReasonCode)Marshal.ReadInt32(notifyData.dataPtr);
if (wlanIface != null)
wlanIface.OnWlanReason(notifyData, reasonCode);
}
但是,我不确定如何将此修复程序添加到我的解决方案中。我从NuGet包管理器安装了ManagedWiFi。因此,不确定如何更改WlanApi.cs文件。关于上述两个问题的任何帮助都非常感谢。
答案 0 :(得分:3)
问题(错误#1)现已解决。 profilexml文件格式对我来说是不同的。这是我更改后的profilexml。
Dim profileXml As String = String.Format("<?xml version=""1.0""?><WLANProfile xmlns=""http://www.microsoft.com/networking/WLAN/profile/v1""><name>{0}</name><SSIDConfig><SSID><hex>{1}</hex><name>{0}</name></SSID></SSIDConfig><connectionType>ESS</connectionType><connectionMode>auto</connectionMode><MSM><security><authEncryption><authentication>WPA2PSK</authentication><encryption>AES</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{2}</keyMaterial></sharedKey></security></MSM></WLANProfile>", GlobalVariables.ssidname, hexval, TextBox1.Text)
当我从我的解决方案中卸载ManagedWiFi软件包并将整个ManagedWiFi项目添加到解决方案时,第二个问题(错误#2)也得到了解决。然后我在SimpleWiFi或Type Native Wifi.Wlan + WlanReasonCode cannot be marshaled error中提到的WlanApi.cs中进行了更改。
答案 1 :(得分:0)
我有一个更简单的任务(读取所连接网络的SSID),它抛出了相同的错误。
我通过完全使用SimpleWiFi来解决此问题,而忽略了ManagedWifi软件包。
浏览源代码,看起来SW是MW中某些功能的固定重新实现。