VS2008: Почему не работает "внешняя" ссылка на дизайнер?
От: eugals Россия  
Дата: 18.10.09 08:32
Оценка:
Привет.
У меня есть простенький тестовый солюшн, в котором содержится три проекта:
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 есть код, который должен бы (как минимум) находить сборки расположенные в том же самом солюшне, а вот не находит почему-то

Вопрос, что я делаю неправильно?

Заранее спасибо за любые квалифицированные комментарии.
.net vs2008 designerattrubute
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.