C# EntryPointNotFoundException

В моей программе на C# я звоню AT91Boot_Scan функция в sam-ba.dll, В документации по этой DLL подпись для этой функции void AT91Boot_Scan(char *pDevList)

К сожалению, что бы я ни пытался, я продолжаю получать EntryPointNotFoundException а также ArgumentNullException ошибки:

Exception thrown at 0x75E3C54F in MyApp.exe: Microsoft C++ exception: EEMessageException at memory location 0x0038E304.
Exception thrown: 'System.EntryPointNotFoundException' in MyApp.exe
Unable to find an entry point named 'AT91Boot_Scan' in DLL 'sam-ba.dll'.
Exception thrown: 'System.ArgumentNullException' in System.Windows.Forms.dll

Мой код выглядит следующим образом, что я делаю не так?

[DllImport("sam-ba.dll")]
unsafe public static extern void AT91Boot_Scan(char* pDevList);

unsafe private string[] LoadDeviceList()
    {
        const int MAX_NUM_DEVICES = 10;
        const int BYTES_PER_DEVICE_NAME = 100;

        string[] deviceNames = new string[MAX_NUM_DEVICES];

        try
        {
            unsafe
            {
                // A pointer to an array of pointers of size MAX_NUM_DEVICES
                byte** deviceList = stackalloc byte*[MAX_NUM_DEVICES];

                for (int n = 0; n < MAX_NUM_DEVICES; n++)
                {
                    // A pointer to a buffer of size 100
                    byte* deviceNameBuffer = stackalloc byte[100];
                    deviceList[n] = deviceNameBuffer;
                }

                // Is casting byte** to char* even legal?
                AT91Boot_Scan((char*)deviceList); 

                // Read back out the names by converting the bytes to strings
                for (int n = 0; n < MAX_NUM_DEVICES; n++)
                {
                    byte[] nameAsBytes = new byte[BYTES_PER_DEVICE_NAME];
                    Marshal.Copy((IntPtr)deviceList[n], nameAsBytes, 0, BYTES_PER_DEVICE_NAME);

                    string nameAsString = System.Text.Encoding.UTF8.GetString(nameAsBytes);
                    deviceNames[n] = nameAsString;
                }
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        return deviceNames;
    }

1 ответ

Решение

Следуя решению Дэвида Тэнси в комментариях, я должен был добавить следующее: sam-ba.dll в качестве ссылки COM (Обозреватель решений> Ссылки> Добавить ссылки> Обзор). Тогда просто создание экземпляра ISAMBADLL Объект класса и вызов методов через этот класс.

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