Службы Windows, C# и OpenCL.dll?

Привет, хаброчеловеки!


Я пишу Службу Windows (Windows Service), в которой, помимо всего прочего, идет проверка на наличие OpenCL устройств в системе. Для этой проверки используется уже установленная библиотека OpenCL.dll, а именно — функция clGetPlatformIDs.


Проблем в том, что после вызова этой функции, не происходит возврата в программу. Служба висит некоторое время, после чего ее убивает винда (timeout). Никаких исключений не вылетает.

Служба работает как LocalSystem.


Импортирую так:
[DllImport("OpenCL.dll")]
        public static extern int clGetPlatformIDs(
                    uint num_entries,
                    [MarshalAs(UnmanagedType.LPArray)] System.IntPtr[] platforms,
                    out uint num_platforms);


Использую так:
int error;
            uint numPlatforms;

            error = Test.clGetPlatformIDs(0, null, out numPlatforms);



Пробовал использовать разные соглашения о вызове (СallingConvention), никаких результатов не дало.


В проекте также используется библиотеки kernel32.dll, advapi32.dll — с ними никаких проблем нет.


Если вышеприведенный код я вставляю в обычный консольный проект, все работает как часы.


Объясните, пожалуйста, что я делаю не так и куда мне копать. Заранее спасибо!
  • Вопрос задан
  • 4295 просмотров
Пригласить эксперта
Ответы на вопрос 1
Malenkov
@Malenkov
А какая реализация (AMD/NV)?

У AMD в SDK 2.5 была строчка «OpenCL can now be used by a Windows service». Но есть подозрение что даже в этом случае будут перечислены только CPU.

В целом сервисы огорожены от взаимодействия с GUI. Можно попробовать выставить галочку «Разрешить взаимодействие с рабочим столом», но вряд ли поможет. Народ выкручивается из ситуации, стартуя фоновые приложения, которые далее взаимодействуют с сервисом.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы