Привет.
У меня есть
простенький тестовый солюшн, в котором содержится три проекта:
1.
ComponentTest, в котором ничего нет, кроме пустого класса компонентов
TestComponent.
2.
Test — пустое консольное приложение, где объявлен компонент
TestComponentImpl наследник от
ComponentTest.TestComponent
3.
ComponentTest.Design — сборка, в которой у меня реализован дизайнер
TestComponentDesigner, предназначенный для редактирования компонентов
TestComponent.
TestComponentDesigner реализован следующим образом:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
namespace ComponentTest.Design
{
public class TestComponentDesigner : System.Windows.Forms.Design.ComponentDocumentDesigner, IRootDesigner
{
// ...
}
}
В TestComponent-е он зареференсен следующим образом:
namespace ComponentTest
{
[ToolboxItem(false),
Designer("ComponentTest.Design.TestComponentDesigner, ComponentTest.Design.DLL", typeof(System.ComponentModel.Design.IRootDesigner))]
public partial class TestComponent : Component
{
// ...
}
}
Проблема заключается в том, что студия не находит этот мой дизайнер при попытке отредактировать
TestComponentImpl.
Выдает такой трейсбэк:
Value cannot be null. Parameter name: instance
at System.ComponentModel.TypeDescriptor.AddAttributes(Object instance, Attribute[] attributes)
at Microsoft.VisualStudio.Design.VSDesignSurface.CreateDesigner(IComponent component, Boolean rootDesigner)
at System.ComponentModel.Design.DesignerHost.AddToContainerPostProcess(IComponent component, String name, IContainer containerToAddTo)
at System.ComponentModel.Design.DesignerHost.Add(IComponent component, String name)
...
ПРИЧЕМ. Если перенести
ComponentTest.Design внутрь самой сборки
ComponentTest и, соответственно, переделать параметры DesignAttrubute:
namespace ComponentTest
{
[ToolboxItem(false),
Designer(typeof(ComponentTest.Design.TestComponentDesigner), typeof(System.ComponentModel.Design.IRootDesigner))]
public partial class TestComponent : Component
{
// ...
}
}
То
всё работает нормально.
К сожалению, с точки зрения архитектуры такой воркэраунд меня не устраивает. Мне нужно хранить дизайнер именно в отдельной сборке от компонента. А её-то студия, похоже, и не находит.
Я пробовал различные ухищрения с именем сборки: добавлял и убирал ".dll", добавлял культуру, пробовал даже регистрировать её ngen-ом. ничего не помогло
Судя по рефлектору, в Microsoft.VisualStudio.Design.VSTypeResolutionService есть код, который должен бы (как минимум) находить сборки расположенные в том же самом солюшне, а вот не находит почему-то
Вопрос, что я делаю неправильно?
Заранее спасибо за любые
квалифицированные комментарии.