Поддержка CPUID в C # - PullRequest
       22

Поддержка CPUID в C #

0 голосов
/ 03 марта 2012

Я бьюсь головой о кирпичную стену на прошлой неделе. Эта кирпичная стена: CPUID.

Все, на что я наткнулся, говорит о том, что в C ++ создается библиотека классов, реализующая CPUID, а затем используется в проекте C #.

По разным причинам мне не удалось заставить библиотеку классов C ++ работать должным образом в моем проекте C #, и я нахожусь в состоянии сдаться и сказать клиенту, что их запрос не может быть выполнено. Тем не менее, я в конце своей веревки и хочу попросить помощи.

Есть ли ЛЮБОЙ способ получения __cpuid () или asm для компиляции в C # без необходимости сборки внешней сборки?

Ответы [ 2 ]

0 голосов
/ 09 марта 2012

На самом деле ... Я никогда не делал этого, и не рекомендуется, если вы хотите, чтобы ваш код был переносимым или даже совместимым с будущими версиями .NET.Однако:

http://www.atrevido.net/blog/2005/01/28/Inline+X86+ASM+In+C.aspx

Это похоже на крутой трюк.Обратите внимание, что в более новых операционных системах данные помечаются как неисполняемые (NX или DEP или как их называет MS).Массив в C # - это данные.Последний комментарий на этой странице дает возможность обойти это.

0 голосов
/ 03 марта 2012

Требуется сборка не на C #, так как компилятор C # генерирует чистый MSIL, и для CPUID нет инструкции MSIL.Вопрос, который вы связали, включает в себя CPUID как данные, а не код, который довольно хрупок, и вам приходится обращаться за пределами .NET к Win32 API, чтобы пометить исполняемый файл данных, что, кажется, противоречит вашему желанию «без внешней сборки».

Однако вы можете скомпилировать свой код C # как .netmodule и использовать компоновщик C ++ / CLI для объединения некоторых функций, использующих CPUID, с выходными данными компилятора C #.В итоге вы получите единственную сборку смешанного режима, созданную набором инструментов C ++ / CLI, но большая ее часть будет написана на C #.

Для этой опции проще всего было бы создать Func<uint> или Func<uint, uint> делегируйте из кода, вызывающего CPUID, и передайте этот делегат в код C #, вместо того, чтобы пытаться заставить код C # вызывать функцию по имени (это позволяет избежать циклической ссылки между двумя проектами).

...