Проблема с преобразователем пользовательского типа в пакете VSX

У меня следующий вопрос. У меня есть решение MSVS с тремя проектами.

  • первый проект - это проект VSX, в котором отображается форма с сеткой свойств.
  • второй — типичный проект библиотеки C# с классом преобразования пользовательского типа BooleanYesNoConverter, унаследованным от BooleanConverter. Этот преобразователь используется для отображения Да/Нет в сетке свойств вместо Истина/Ложь.
  • третий проект также является проектом библиотеки C#, который содержит общедоступный класс с одним общедоступным свойством, имеющим атрибут [TypeConverter(typeof(BooleanYesNoConverter))]

Есть ссылки на второй проект из первого и третьего.

Когда мы запускаем первый проект в режиме отладки (в кусте VS Experimental) и нажимаем на меню, плагин загружает сборку, сгенерированную из третьего проекта (с помощью Assembly.LoadFrom), и создает экземпляр нашего класса (с одним общедоступным логическим свойством). Затем он передает этот экземпляр свойству propertyGrid.SelectedObject. В сетке свойств отображается общедоступное свойство, но вместо Да/Нет справа отображается True/False.

Я поставил точки останова в методах обложки (и в конструкторе), но, похоже, мы туда не пошли. Вместо пользовательского преобразователя типов используется стандартный.

Более интересно, что если я помещу класс BooleanYesNoConverter в третий проект (так что это будет n одна сборка с моим классом), сетка свойств показывает правильные варианты Yes/No.

Спасибо за вашу помощь заранее!


person Dima    schedule 15.10.2010    source источник
comment
Недавно я нашел эту ссылку (social.msdn.microsoft.com/Forums/en-US/vsx/thread/). Этот человек также столкнулся с той же проблемой. Есть предложение поместить пользовательские конвертеры в GAC, но я не хочу делать это таким образом, так как этот конвертер очень специфичен для проекта.   -  person Dima    schedule 15.10.2010


Ответы (1)


Полазив по интернету обнаружил, что не только я сталкивался с такой проблемой. Я нашел похожие вопросы в следующем месте:

http://social.msdn.microsoft.com/Forums/en/vsx/thread/a04b45d2-1d0a-4cfc-a0f0-1d458b2d6e26

(еще одна ссылка, которую вы можете найти в моем комментарии)

И я нашел подходящее (для меня) решение: я написал ассемблерный ресолвер. Другими словами, я добавляю следующий код в метод инициализации моего плагина:

    AppDomain.CurrentDomain.AssemblyResolve +=
    new ResolveEventHandler(LoadAssembly);

и этот метод для класса плагина:

    private Assembly LoadAssembly(object sender, ResolveEventArgs e)
    {
        int commaIndex = e.Name.IndexOf(',');
        string fileName = e.Name.Substring(0, commaIndex) + ".dll";
        Assembly assembly = Assembly.LoadFrom(fileName);
        return assembly;
    }

Теперь он работает нормально.

person Dima    schedule 18.10.2010