2017-02-21 27 views
2

Я пытаюсь создать и подключиться к профилю WLAN с помощью собственного WiFi (https://managedwifi.codeplex.com/). Я могу просмотреть весь список BSS сети и их параметры. Однако, когда я пытаюсь создать/перезаписать WLAN профиль, я получаю сообщение об ошибке указанной ниже (Ошибка № 1):Проблемы с использованием управляемого WiFi (NativeWiFi API)

Необработанное исключение типа «System.ComponentModel.Win32Exception» произошло в ManagedWifi.dll ,

Дополнительная информация: Профиль подключения к сети повреждена

Однако, когда я создал профиль, обычно из «Сеть и коммутационный центр» панели управления Windows 7, а затем пытался подключиться с помощью ManagedWiFi, я получить еще одно сообщение об ошибке (Error # 2):

необработанное исключение типа 'System.ArgumentException' произошло в mscorlib.dll

Дополнительная информация: Тип «NativeWifi.Wlan + Wla nReasonCode 'не может быть маршализирован как неуправляемая структура; никакие значимые размеры или смещение не могут быть вычислены.

Я заметил, что эта ошибка возникает, даже если я пытаюсь подключиться/отключиться от профиля 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», вопрос (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); 
} 

Однако я не уверен, как добавить это исправление в мое решение. Я установил ManagedWiFi из диспетчера пакетов NuGet. Следовательно, не знаете, как изменить файл WlanApi.cs. Любая помощь в отношении вышеупомянутых двух проблем очень ценится.

+0

Странно то, что это изменение ни на что не влияет. Посмотрев на это, можно сказать, что это увеличивает риск исключений, так как то, что делает этот код, заключается в том, что он проверяет, что размер 'notifyData' имеет, по крайней мере, тот же размер, что и' Wlan.WlanReasonCode' (если это целая перечисление, размер должен быть '4', как в 4 байта/int). –

+0

Ошибка # 2, по-видимому, исправлена, поскольку я удалил пакет ManagedWiFi из своего решения и добавил весь проект ManagedWiFi в решение. Затем я внес изменения в WlanApi.cs, как указано в исправлении выше. –

+0

Хорошо, что это положительно, тогда, должно быть, проблема с пакетом NuGet, но создание исходного кода все еще работает. –

ответ

3

Проблема (ошибка № 1) теперь разрешена. Формат файла 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) 

Также второй выпуск (Ошибка № 2) был решен, когда я удалил пакет ManagedWiFi от моего решения и добавил весь проект ManagedWiFi к решению. Затем я внес изменения в WlanApi.cs, как указано в SimpleWiFi или Type Native Wifi.Wlan + WlanReasonCode cannot be marshaled error.

+0

спасибо за исправление ошибки №2, место на – NSGaga