Сборки .Net Designer, ошибка C ++ \ C # - PullRequest
1 голос
/ 06 апреля 2010

Я работаю над дизайнерским приложением (использующим Visual C ++ 2.0, но решение C # все еще должно быть актуально). Моя установка такова:

У меня есть UserControl с именем "Host" Я пытаюсь использовать UserControl с именем "Child"

Дочерний объект содержит свойство для класса, тип которого полностью определен в другой dll, с именем "mytools.dll"

Ребенок отлично работает в конструкторе. Однако когда я перетаскиваю «child» на «host» из конструктора, я получаю следующую ошибку:

Failed to create component 'Child'.  The error message follows:  'System.io.filenotfoundexception: could not load file or assembly MyTools, Version XXXXXX, Culture=neutral
.....
{unhelpful callstack}

Если я закомментирую свойство "child", которое указывает на класс в mytools.dll, все выглядит просто замечательно. У меня есть свойство, помеченное как «Browsable (false) и DesignerSerializable (hidden), и это не помогает.

Есть ли способ для меня явно сказать "Не загружайте эту dll, она вам не понадобится во время разработки", или каким-то образом для меня заставить библиотеку dll загружаться из конструктора программно?

Спасибо!

Ответы [ 3 ]

1 голос
/ 06 апреля 2010

Нет, здесь проблема с яйцом и курицей.Чтобы найти примененные вами атрибуты, дизайнер должен использовать Reflection для загрузки Type.Загрузка типа требует загрузки любых типов, используемых его членами.Что заставит CLR отправиться на поиски вашей сборки mytools.dll.

Путь проверки, действующий во время разработки, - это путь для Visual Studio, а не для вашего приложения.Как именно выглядит этот путь, для меня мутно.Инструментарий также играет свою роль.Создает копию сборки, которая содержит элемент управления в частном каталоге.Место для поиска: c: \ users \ yourname \ appdata \ local \ microsoft \ visualstudio \ 9.0 \ projectassemblies.Это часто идет не так, и случайные копии остаются в этом каталоге.Мне приходится время от времени очищать его вручную, когда я замечаю, что инициализация набора инструментов начинает замедляться.

Что-то, что вы можете проверить, чтобы увидеть, присутствует ли там копия mytools.dll, ине старая версияГоворя это, GAC - это один из способов избежать неприятностей.

1 голос
/ 08 апреля 2010

Если свойство помечено как «общедоступное», то UserControl заставит конструктор загрузить внешнюю сборку.

Вы должны переделать свой элемент управления, чтобы он возвращал Object вместо неверного типа, и выполнять приведение типов, если вы должны держать его открытым, в противном случае защита должна быть в порядке.

0 голосов
/ 06 апреля 2010

UserControl имеет свойство DesignMode, но я не уверен, хочет ли .NET заранее разрешить тип (т. Е. Вернуть null, если DesignMode == true).

В качестве альтернативы, если вы единственный разработчик, вы можете обработать событие AppDomain.CurrentDomain.AssemblyResolve и загрузить фиктивную сборку самостоятельно.

...