Тип Native Wifi.Wlan + WlanReasonCode не может быть маршализованной ошибкой

Хотел спросить ваше мнение об этой ошибке, которую я получаю при запуске кода добавления моего профиля Wifi.

Теперь код, который вы видите, является примером, который я использую (потому что я новичок в интерфейсе Wlan в C#).

Я пытаюсь добавить в свою программу функцию wlan, которая будет искать определенную беспроводную сеть, добавлять этот профиль к ПК и подключать его (тест ping - все получилось, ура).

Пожалуйста, см. Рис для ошибки: здесь я обнаружил, что если я удалю профиль Чизкейк из папки Windows, ошибка не произойдет. Это говорит мне, что ошибка могла быть чем-то из-за того, что профиль уже сохранен. Но не уверен в этом.

Я прилагаю свой пример кода здесь также к вашему сведению. Любая помощь будет оценена.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using NativeWifi;

    namespace WIFI_CONTROL_EXAMPLE
    {
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        lstNetworks.Items.Clear();
        WlanClient client = new WlanClient();
        foreach(WlanClient.WlanInterface wlanIface in client.Interfaces )
        {
            Wlan.WlanAvailableNetwork[]networks = wlanIface.GetAvailableNetworkList(0);
            foreach (Wlan.WlanAvailableNetwork network in networks)
            {
                Wlan.Dot11Ssid ssid = network.dot11Ssid;
                string networkName = Encoding.ASCII.GetString(ssid.SSID, 0, (int)ssid.SSIDLength);

                ListViewItem item = new ListViewItem(networkName);
                item.SubItems.Add(network.dot11DefaultCipherAlgorithm.ToString());
                item.SubItems.Add(network.wlanSignalQuality + "%");
                lstNetworks.Items.Add(item);

            }


        }


    }

    private void button2_Click(object sender, EventArgs e)
    {
        WlanClient client = new WlanClient();
        foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
        {

            string profileName = "Cheesecake"; // this is also the SSID
            string mac = "52544131303235572D454137443638";
            string key = "hello";
            string profileXml = 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>", profileName, mac, key);
            wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);
            wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);
        }



        //string x = "";

        //x = lstNetworks.SelectedItems[0].Text;
        //foreach
        //MessageBox.Show("you have selected " + x);
        //string profileName = x;
        //string profileXml = string.Format("<?xml version=\"1.0\"?><WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID><nonBroadcast>false</nonBroadcast></SSIDConfig><connectionType>ESS</connectionType><connectionMode>manual</connectionMode><MSM><security><authEncryption><authentication>open</authentication><encryption>WEP</encryption><useOneX>false</useOneX></authEncryption></security></MSM></WLANProfile>", profileName);
        //wlanIface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);
        //wlanIface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, profileName);

    }
}
   }

спасибо мат

1 ответ

Я думаю, что я, возможно, решил проблему, но я не уверен, каковы будут последствия этого.

Я использую Managed Wifi API и в WlanAPI.cs есть строка кода, которая проверяет размер кода возврата. Это строка:

 int expectedSize = Marshal.SizeOf(typeof(Wlan.WlanReasonCode));

я выяснил, что когда код Reason равен "Success", он имеет нумерованное значение 0. Поэтому я прокомментировал строку и добавил ноль в следующей строке как таковой:

                            //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);
                            }

это похоже на работу, но я не уверен, что открыл банку с червями. Ребята, вы можете придумать какое-нибудь другое лучшее решение?

Спасибо мат

Другие вопросы по тегам