System.IO.FileNotFoundException исключение при попытке удалить UserControl на форму в дизайнере

Я создал пользовательский элемент управления UserControl в Managed C ++, который включает в себя некоторые элементы управления собственным кодом. Я подтвердил, что элемент управления работает во время выполнения, и пытался заставить его работать с дизайнером Visual Studio, позволяя перетаскивать элемент управления из панели инструментов дизайнера.

Хотя я успешно добавил UserControl в панель инструментов, ничего не происходит, когда я перетаскиваю элемент управления в форму Windows. Чтобы исследовать проблему, я открыл второй экземпляр Visual Studio 2008 и подключил его отладчик к экземпляру devenv.exe, в котором я пытаюсь использовать UserControl. После перетаскивания UserControl в формы Windows отладчик Visual Studio выводит исключение FileNotFoundException в mscorlib.dll при попытке загрузить модуль, содержащий UserControl.

Я заметил, что дизайнер не загружает dll из пути вывода проекта, а скорее создает копию сборки в папке% UserData% \ VisualStudio \ 9.0 \ ProjectAssemblies \ RandomFolderName. Однако никакие зависимости модуля не копируются, что, как я считаю, является источником исключения FileNotFoundException.

Есть идеи, как решить эту проблему? В идеале Vistual Studio скопировала бы все зависимости сборки при копировании dll в папку ProjectAssemblies, но я не могу понять, как это сделать.


person Joe Waller    schedule 18.11.2008    source источник


Ответы (3)


Visual Studio не знает ни о каких неуправляемых зависимостях. Вам нужно будет скопировать DLL самостоятельно или скопировать их в каталог windows \ system32.

Две другие стратегии решения этой проблемы.

  1. Оберните эту сборку другой сборкой и вручную загрузите смешанную dll с помощью assembly.loadfrom. эта функция установит правильный каталог загрузки для вашей dll смешанного режима.

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

person Aaron Fischer    schedule 18.11.2008
comment
Я боялся, что это так. Копирование файлов в системный каталог не является для меня идеальным решением, и поскольку дизайнер Visual Studio создает копию сборки в случайной папке каждый раз, когда экземпляр удаляется в форму, копирование модулей само по себе также не является жизнеспособным решением. - person Joe Waller; 18.11.2008
comment
windows \ system2? Вы имеете в виду c: \ Windows \ System32 или c: \ Windows \ System? - person bitbonk; 02.12.2009

Старый поток, но отправляю свое решение по аналогичной проблеме, так как я только что столкнулся с проблемой и нашел этот вопрос во время процесса. Поскольку вы обертываете элемент управления, это может быть не так просто исправить, как у меня, только с доступом к типам.

По сути, я просто заставил встроенные библиотеки DLL загружаться с задержкой в ​​моей библиотеке C ++ / CLI-оболочки. Поскольку часть оболочки C ++ / CLI содержит спецификации интерфейса, используемые Visual Studio и фреймворком, собственная DLL никогда не требуется и не загружается. Я ответил на него более подробно в этом вопросе: https://stackoverflow.com/a/15481687/34440

person CuppM    schedule 18.03.2013
comment
Интересная идея. Хотя этого проекта давно нет, я думаю, это сработало бы. Мне действительно не нужен был какой-либо код из DLL при перетаскивании элемента управления в форму, и я мог бы поместить временную графику (из оболочки CLI) на его место в дизайнере. Хороший. - person Joe Waller; 21.03.2013

Старайтесь ничего не помещать в конструктор элемента управления, который будет обращаться к файлам. Если нужно, иногда свойство DesignTime помогает пропустить оскорбительные строки.

person Tomer Pintel    schedule 18.11.2008