Не удается запустить Microsoft.FlightSimulator.SimConnect.dll в Visual Studio C#

#c# #visual-studio

#c# #visual-studio

Вопрос:

Я пытался создать приложение Windows forms для Flight Simulator 2020 с помощью SimConnect. Проблема в том, что я, похоже, не могу запустить DLL в Visual Studio. Каждый раз, когда я нажимаю «Пуск», я либо получаю сообщение с ошибкой: «System.IO.FileNotFoundException» при компиляции в x64 соответственно. Любой процессор или «Система.Исключение BadImageFormatException» при компиляции на x86.

Вещи, которые я уже пробовал, но безуспешно:

  • Переустановка MSFS SDK
  • Перемещение библиотеки dll в папку проекта Visual Studio
  • Компиляция с другими настройками, такими как x64, x86 или любой процессор
  • Пробуем разные версии .NET framework
  • и т.д…

Microsoft.FlightSimulator.SimConnect.dll находится в ссылках и SimConnect.dll отображается в нижней части обозревателя решений. Несмотря на то, что я следовал инструкциям YouTube один за другим, я не смог заставить его работать.

Кстати: у меня есть функционирующий пример проекта Visual Studio C #, который успешно использует SimConect для получения данных из симулятора и в него.Этот проект можно найти здесь .

Я подозреваю, что мне нужно изменить некоторые свойства моего проекта Visual Studio, но я понятия не имею, я буквально только начинаю кодировать xD. Поэтому я был бы очень благодарен, если бы кто-нибудь мог помочь мне с моей проблемой.

код:

 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 System.IO.Ports;
using Microsoft.FlightSimulator.SimConnect;
using System.Runtime.InteropServices;

namespace ZZA1
{

public partial class Form1 : Form
{
    bool portus1, portus2, portus3, portus4, portus5;
    String dataIN, dataIN2 , dataIN3, dataIN4, dataIN5;


    public Form1()
    {
        response = 1;
        output = "nnnnnnnnnn";
        InitializeComponent();
    }
    SimConnect simconnect = null;

    private void label1_Click(object sender, EventArgs e)
    {

    }

    public class FileNotFoundException : System.IO.IOException
    {
        
    }
    private void button1_Click(object sender, EventArgs e)
    {
        portus1 = !portus1;
        try
        { 
            switch (portus1)
            {
                case true:
                    serialPort1.PortName = Portbox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(baudbox1.Text);
                    serialPort1.Open();                       
                break;
                case false:
                    serialPort1.Close();
                break;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message,"ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

        if (serialPort1.IsOpen)
        {
            condiscon.BackColor = Color.Green;
            condiscon.Text = "Connected";
            Portbox1.Enabled = false;
            baudbox1.Enabled = false;
            Serialdata.Text = "";
        }
        else
        {
            condiscon.BackColor = Color.Red;
            condiscon.Text = "Disconnected";
            Portbox1.Enabled = true;
            baudbox1.Enabled = true;
        } 
    }

    private void button1_Click_1(object sender, EventArgs e)
    {
        if (my_simconnect == null)
        {
            try
            {
                my_simconnect = new Microsoft.FlightSimulator.SimConnect.SimConnect("Managed Data Request", base.Handle, 0x402, null, 0);
                initDataRequest();
            }
            catch (COMException zui)
            {
                MessageBox.Show(zui.Message, "Unable", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        else
        {
            contosim.Text = "ERROR - Try again";
            closeConnection();
        }
    }

    private void condiscon2_Click(object sender, EventArgs e)
    {
        portus2 = !portus2;
        try
        {
            switch (portus2)
            {
                case true:
                    serialPort2.PortName = Portbox2.Text;
                    serialPort2.BaudRate = Convert.ToInt32(baudbox2.Text);
                    serialPort2.Open();
                break;
                case false:
                    serialPort2.Close();   
                break;
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        if (serialPort2.IsOpen)
        {
            condiscon2.BackColor = Color.Green;
            condiscon2.Text = "Connected";
            Portbox2.Enabled = false;
            baudbox2.Enabled = false;
            Serialdata2.Text = "";
        }
        else
        {
            condiscon2.BackColor = Color.Red;
            condiscon2.Text = "Disconnected";
            Portbox2.Enabled = true;
            baudbox2.Enabled = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();
        Portbox1.Items.AddRange(ports);
        Portbox2.Items.AddRange(ports);
    }

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        dataIN = serialPort1.ReadExisting();
        this.Invoke(new EventHandler(ShowData));
    }
    private void serialPort2_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
    {
        dataIN2 = serialPort2.ReadExisting();
        this.Invoke(new EventHandler(ShowData2));
    }

    private void ShowData(object sender, EventArgs e)
    {
        Serialdata.Text  = dataIN;
    }

    private void ShowData2(object sender, EventArgs e)
    {
        Serialdata2.Text  = dataIN2;
    }

    private void Serialdata_TextChanged(object sender, EventArgs e)
    {

    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (serialPort1.IsOpen)
        {
            serialPort1.Close();
        }
        if (serialPort2.IsOpen)
        {
            serialPort2.Close();
        }
    }

    private void initDataRequest()
    {
        try
        {
            my_simconnect.OnRecvOpen  = new SimConnect.RecvOpenEventHandler(simconnect_OnRecvOpen);
            my_simconnect.OnRecvQuit  = new SimConnect.RecvQuitEventHandler(simconnect_OnRecvQuit);
            my_simconnect.OnRecvException  = new SimConnect.RecvExceptionEventHandler(simconnect_OnRecvException);
            my_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Title", null, SIMCONNECT_DATATYPE.STRING256, 0.0f, SimConnect.SIMCONNECT_UNUSED);
            my_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Plane Latitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
            my_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Plane Longitude", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
            my_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Plane Heading Degrees True", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
            my_simconnect.AddToDataDefinition(DEFINITIONS.Struct1, "Ground Altitude", "meters", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
            my_simconnect.RegisterDataDefineStruct<Struct1>(DEFINITIONS.Struct1);
            my_simconnect.OnRecvSimobjectDataBytype  = new SimConnect.RecvSimobjectDataBytypeEventHandler(simconnect_OnRecvSimobjectDataBytype);
        }
        catch (COMException op)
        {
            MessageBox.Show(op.Message, "ERR", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }

    }

    private Microsoft.FlightSimulator.SimConnect.SimConnect my_simconnect;
    private string output;
    private int response;
    const int WM_USER_SIMCONNECT = 0x402;
   
    private enum DEFINITIONS
    {
        Struct1
    }

    private void simconnect_OnRecvOpen(SimConnect sender, SIMCONNECT_RECV_OPEN data)
    {
        contosim.BackColor = Color.Green;
        contosim.Text = "Disconnect from Flight Simulator";
    }

    private void simconnect_OnRecvQuit(SimConnect sender, SIMCONNECT_RECV data)
    {
        closeConnection();
    }

    private void closeConnection()
    {
        if (my_simconnect != null)
        {
            my_simconnect.Dispose();
            my_simconnect = null;
            contosim.BackColor = Color.Red;
            contosim.Text = "Connect to Flight Simulator";
        }
    }
    
    private void simconnect_OnRecvException(SimConnect sender, SIMCONNECT_RECV_EXCEPTION data)
    {
        contosim.Text = "Exception received:"   ((uint)data.dwException);
        contosim.BackColor = Color.Orange;
    }

    private void simconnect_OnRecvSimobjectDataBytype(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA_BYTYPE data)
    {
        string DirNumberText = "";
        string DirNumber1Text = "";
        string DirNumber2Text = "";
        string FileNumberText = "";
        string FileNumber1Text = "";
        string FileNumber2Text = "";
        double DirNumber1 = 0;
        double DirNumber2 = 0;
        double FileNumber1 = 0;
        double FileNumber2 = 0;

        if (data.dwRequestID == 0)
        {
            Struct1 struct1 = (Struct1)data.dwData[0];
        }
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    private struct Struct1
    {
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x100)]
        public string title;
        public double latitude;
        public double longitude;
        public double trueheading;
        public double groundaltitude;
    }
    protected override void DefWndProc(ref Message m)
    {
        if (m.Msg == WM_USER_SIMCONNECT)
        {
            if (my_simconnect != null)
            {
                my_simconnect.ReceiveMessage();
            }
        }
        else
        {
            base.DefWndProc(ref m);
        }
        
    }
    
    private enum DATA_REQUESTS
    {
        REQUEST_1
    }


}
  

}

Ответ №1:

У меня была точная проблема с MSFS SDK. Вот как я это решил.

Как и вы, я пытался:

  • Компиляция в другом.СЕТЕВЫЕ версии и типы процессоров
  • Переустановка MSFS SDK
  • Обновление GAC
  • Воссоздание файлов проекта
  • и т. Д

Однако это исключение на самом деле касалось не Microsoft.FlightSimulator.SimConnect его самого, а того SimConnect.dll , что поставляется с SDK. Вы упомянули, что пытались переместить DLL-файлы в папку проекта Visual Studio, и это едва ли является решением.

Решение проблемы, однако, было очень простым: просто добавьте ..MSFS SDKSimConnect SDKlibSimConnect.dll в папку x64 binary вашей сборки. В моем случае это было <project_name>binx64Debug .

Также не забудьте создать проект для x64. Я надеюсь, что ответ был полезным.

Комментарии:

1. Для уточнения — вам нужны ОБА Microsoft. FlightSimulator. SimConnect. dll И SimConnect. dll в вашей папке debug. В документации упоминается только добавление ссылки на первую, которая затем будет автоматически скопирована. Вам нужно вручную скопировать SimConnect. dll в папку debug или настройте скрипт для его копирования во время компиляции.