C# с использованием ImageSearch из AutoIt

Я пытаюсь использовать эту DLL из AutoIt с C# (ImageSearch)

DLL должна обнаруживать заданное изображение на экране

Это мой код:

[DllImport("ImageSearchDLL.dll")]
private static extern IntPtr ImageSearch(int x, int y, int right, int bottom, [MarshalAs(UnmanagedType.LPStr)]string imagePath);

public static String[] UseImageSearch(string imgPath)
{
    int right = Screen.PrimaryScreen.WorkingArea.Right;
    int bottom = Screen.PrimaryScreen.WorkingArea.Bottom;

    IntPtr result = ImageSearch(0, 0, right, bottom, imgPath);
    String res = Marshal.PtrToStringAnsi(result);

    if (res[0] == '0') return null;//not found

    String[] data = res.Split('|');
    //0->found, 1->x, 2->y, 3->image width, 4->image height;        

    // Then, you can parse it to get x and y:
    int x; int y;
    int.TryParse(data[1], out x);
    int.TryParse(data[2], out y);

    return data;
}

Итак, я получаю System.BadImageFormatException при вызове функции ImageSearch в этой строке:

IntPtr result = ImageSearch(0, 0, right, bottom, imgPath);

Есть идеи? большое спасибо

1 ответ

У меня есть System.BadImageFormatExceptionпотому что я использовал 32- битную.dll, а мой проект был установлен на x64

Когда я поменял.dll на 64-битный, все заработало. Вот как я его использую (асинхронный режим):

CustomApi.cs

       using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace MyApp
{
    public static class CustomApi
    {
        //The .dll must be in the same folder as the app
        //You can also use [DllImport("C:\\full\\path\\to\\dll.dll")]
        [DllImport("_ImageSearch_x64.dll")]
        private static extern IntPtr ImageSearch(int x, int y, int right, int bottom, [MarshalAs(UnmanagedType.LPStr)] string imagePath);


        public static ImageSearchResult SearchImage(string imgFullPath, int tolerance = 0)
        {
            //Don't delete the space
            imgFullPath = $"*{tolerance} {imgFullPath}";

            var result = ImageSearch(1, 1, Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height, imgFullPath);
            var res = Marshal.PtrToStringAnsi(result);

            if (string.IsNullOrEmpty(res) || res[0] == '0')
                return null;

            var data = res.Split('|');
            int.TryParse(data[1], out var x);
            int.TryParse(data[2], out var y);

            return new ImageSearchResult(x,y);
        }
    }
}

ImageSearchResult.cs

       namespace MyApp
{
    public class ImageSearchResult
    {
        public int X { get; set; }
        public int Y { get; set; }

        public ImageSearchResult(int x, int y)
        {
            X = x;
            Y = y;
        }
    }
}

MainForm.cs

       public static async Task<ImageSearchResult> FindImage(string imageFullPath, int timeOut = 15)
        {
            
            return await Task.Run(() =>
            {
                ImageSearchResult result = null;

                for (int i = 0; i < timeOut; i++)
                {
                    result = CustomApi.SearchImage(imageFullPath, tolerance: 0);
                    if (result != null)
                        break;

                    Thread.Sleep(1000);
                }

                return result;
            });

        }


        //Put this wherever you want
        var result = await FindImage(@"C:\my_image.bmp"); //Must be .bmp
        if (result == null)
            Console.WriteLine("c non");
        else
            Console.WriteLine($"Found : X:{result.X} Y:{result.Y}");

Скачал отсюда.dll

Также на всякий случай залил в ZippyShare

Вы получаете System.BadImageFormatException поскольку вы передаете ноль в качестве первого аргумента, это должно быть имя файла изображения.

Пример использования:

ImageSearch('checkImage.bmp', 0, 100, 500, 0)

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