Как Вы получаете каталог решения в C# (VS 2008) в коде?

Получил раздражающую проблему здесь. У меня есть приложение NHibernate/Forms, я работаю через SVN. Я сделал некоторые из своих собственных средств управления, но когда я перетаскиваю их (или просматриваю некоторых редакторов формы, где я уже перетащил) на некоторые мои другие средства управления, Visual Studio решает, что должна выполнить часть кода, который я записал, включая часть, которая ищет hibernate.cfg.xml.

Я понятия не имею, почему это, но (иногда!), когда это выполняет код во время моей загрузки формы или перетаскивает его, переключает текущий каталог на C:\program files\vs 9.0\common7\ide, и затем nhibernate выдает исключение, что это не может найти hibernate.cfg.xml, потому что я ищу это в относительном пути.

Теперь, я не хочу трудно кодировать местоположение hibernate.cfg.xml или просто копировать hibernate.cfg.xml в каталог язя (который будет работать). Я хочу решение, которое получает каталог решений, в то время как текущий каталог является common7\ide. Что-то, что позволит кому-то просмотреть мои формы в разработчике на новом контроле к произвольному каталогу на произвольной машине. И не, я не собираюсь загрузить средства управления в коде. У меня есть столько средств управления в рамках средств управления, что это - кошмар для выстраивания в линию всего без него.

Я попробовал пред событие сборки, которое сделало файл, который имеет каталог решения в нем, но конечно как я могу найти это от common7\ide? Все файлы проектов должны быть в каталоге решения из-за svn.

Спасибо за Ваших парней справки я уже провел несколько часов, играя с этим напрасно.

ОБНОВЛЕНИЕ: Я установил hibernate.cfg как встроенный ресурс. Для каждой конфигурации я просто делаю новую конфигурацию сборки, отладку, выпуск, XYZ. В большинстве случаев я рекомендовал бы встроить любые файлы, от которых Вы зависите запустить программу. Это делает намного более простым создать установщик.

10
задан Isaac Bolinger 21 December 2013 в 01:17
поделиться

3 ответа

Это, вероятно, немного поздно, но я нашел решение на http://www.tek-tips.com/viewthread.cfm?qid=1226891&page= 164 . Поскольку я использую Visual Studio 2010, я внес несколько незначительных изменений. Вы должны сослаться на EnvDTE и EnvDTE100 (EnvDTE90 для VS2008)

string solutionDirectory = ((EnvDTE.DTE)System.Runtime
                                              .InteropServices
                                              .Marshal
                                              .GetActiveObject("VisualStudio.DTE.10.0"))
                                   .Solution
                                   .FullName;
solutionDirectory = System.IO.Path.GetDirectoryName(solutionDirectory);

Конечно, я использовал VisualStudio.DTE.10.0, вам, вероятно, следует использовать VisualStudio.DTE.9.0.

Удачи!

18
ответ дан 3 December 2019 в 14:17
поделиться

Похоже, вам просто нужно указать лучший путь к вашему файлу конфигурации.

Если вы сделаете что-то вроде этого:

configPath =  Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "\\PathToCFG");

вы не должны ошибиться, когда Windows изменит текущий каталог на вас.

Изменить: Возможно, у вас возникла проблема с процессом хостинга Visual Studio . Вы можете отключить это? В разделе свойства проекта \ отладка есть флажок.

2
ответ дан 3 December 2019 в 14:17
поделиться

Обновление : К сожалению, я не знаю, как получить папку с вашим решением во время разработки. Итак, технически я не отвечаю на ваш вопрос, а просто предлагаю возможное решение.

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

Обратите внимание, что есть некоторые оговорки в отношении значения свойства DesignTime , а именно, если вы разрабатываете свой элемент управления или если вы разрабатываете форму, содержащую ваш элемент управления, оно вернет правильное значение true, но если вы при разработке формы, содержащей элемент управления, содержащий ваш элемент управления, она вернет false.

Из-за этого вы можете пропустить всю проверку DesignTime и всегда искать конфигурацию NHibernate в базовом пути вашей сборки, если ваш стандартный способ найти этот файл конфигурации не работает.

3
ответ дан 3 December 2019 в 14:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: