Я желал записать, простые окна окружают расширение для добавления к контекстному меню, и C# является языком я большая часть использования эти дни. Действительно ли это - достойный выбор для расширения оболочки? До действительно ли интерфейсов легко получить с ним? Есть ли дополнительные издержки, которые заставляют меню быть медленнее для появления?
У кого-либо есть хорошие указатели для начала работы?
Да. Если вы не знаете, как следует обрабатывать исключение, вам лучше бросить его, а не просто проглотить его и распечатать след стека (или, что еще хуже, абсолютно ничего не делать).
Это поможет предотвратить некоторые чрезвычайно трудные для отладки ошибки в дальнейшем.
-121--2265250-Синктактический сахар мой друг... компилятор преобразует вызов .HasValue в код, который не вызывает исключения: -)
-121--2182192-Сообщение Рэймонда: Не записывайте расширения оболочки в процессе в управляемый код .
Недавнее продолжение: Теперь, когда версия 4 платформы .NET Framework поддерживает параллельное выполнение процессов, можно ли теперь записывать расширения оболочки в управляемый код?
Суть в том, что нет, это не нормально:
Было пересмотрено Руководство по внедрению внутрипроцессных расширений , и оно продолжает рекомендацию не записывать расширения оболочки и расширения Internet Explorer (и другие типы внутрипроцессных расширений) в управляемый код, даже если вы используете версию 4 или выше.
Рискуя выглядеть глупо, EZShellExtensions - прекрасная (но не бесплатная) платформа для разработки расширений оболочки на C #. . Вы можете написать простое расширение контекстного меню примерно с 20 строками кода и, что самое главное, никогда не придется возиться с COM-интерфейсами.Моя компания использует его (и их структуру расширения пространства имен) для набора расширений, которые в настоящее время используются десятками тысяч клиентов, и, чего бы это ни стоило, у нас никогда не было проблем с конфликтом CLR, описанным выше.
Вот небольшой пример, демонстрирующий, насколько это просто:
[Guid("00000000-0000-0000-0000-000000000000"), ComVisible(true)]
[TargetExtension(".txt", true)]
public class SampleExtension : ContextMenuExtension
{
protected override void OnGetMenuItems(GetMenuitemsEventArgs e)
{
e.Menu.AddItem("Sample Extension", "sampleverb", "Status/help text");
}
protected override bool OnExecuteMenuItem(ExecuteItemEventArgs e)
{
if (e.MenuItem.Verb == "sampleverb")
; // logic
return true;
}
[ComRegisterFunction]
public static void Register(Type t)
{
ContextMenuExtension.RegisterExtension(typeof(SampleExtension));
}
[ComUnregisterFunction]
public static void UnRegister(Type t)
{
ContextMenuExtension.UnRegisterExtension(typeof(SampleExtension));
}
}