Вы получите множество советов не делать это в C#. Я не могу порекомендовать иначе, шансы, что ваш десктоп не будет работать, велики. Проблема заключается в проблеме внедрения версии CLR, процесс (например, explorer.exe) может иметь только одну загруженную версию CLR. И ваш десктоп не будет работать, если это неправильная версия.
В .NET 4.0 были добавлены очень конкретные меры противодействия этой проблеме, его CLR поддерживает внутрипроцессные параллельные версии CLR. Другими словами, в одном процессе загружено более одной среды CLR. Эта функция работает в этом конкретном сценарии: COM-сервер, которому нужна среда CLR, поскольку она написана в управляемом коде. Таким образом, абсолютным требованием является то, что вы должны написать расширение, ориентированное на .NET 4.0 или выше.
Но все еще существует устаревшая проблема и основная причина того, что Microsoft до сих пор не поддерживает этот сценарий для расширений оболочки. Есть проблема «кто придет первым». Несмотря на предупреждение не делать этого, существуют расширения оболочки, которые используют управляемый код и нацелены на CLR версии 2. Если такое расширение загружается раньше вашего, это совершенно случайное событие, поскольку оно зависит от порядка ключей в реестре, Explorer может сначала загрузить CLR 2. Что затем препятствует работе функции параллельной работы в процессе, она может закончиться только тогда, когда сначала будет загружена CLR версии 4.
Это совершенно невозможно диагностировать, Проводник не пищит, когда расширение не может быть загружено. И неисправимый для обычного пользователя, вы не можете ожидать, что он будет возиться с непонятными ключами реестра.
Пройдет много времени, прежде чем эту проблему можно будет полностью отбросить. На самом деле Windows должна прекратить поддержку версий .NET до .NET 4, чтобы иметь гарантию. Windows 8 начала с того, что .NET 3.5 не была установлена по умолчанию, но все же ее очень легко добавить. Так что сделайте это много времени, десятилетие или больше.
Что ж, будьте осторожны, вы можете заставить его работать на C #, если не беспокоитесь о случайных сбоях. Затем вы погрузитесь в очень неясные детали COM-интерфейса, чтобы выжить в них, требуются навыки черного пояса, знание того, как правильно объявить интерфейс [ComImport]. Это не то, что вы должны решать сами, это уже сделали другие. У меня нет привычки рекомендовать продукты, но я не могу не рекомендовать EZShellExtensions, библиотека, специально разработанная для помощи в написании расширений оболочки на C#. Поддержка десктопов — одна из рекламируемых функций. Используйте пробную версию, чтобы поработать с этим, чтобы увидеть, сможете ли вы довести это до конца.
person
Hans Passant
schedule
22.12.2012