В .NET, как я могу определить, установлен ли у пользователя определенный распространяемый файл? - PullRequest
0 голосов
/ 16 июня 2009

Я создал класс, который создает отчет Crystal и отображает его в средстве просмотра отчетов.

Однако без распространения Crystal Crystal код вылетает. Как программно определить, установлен ли у конечного пользователя Crystal DLL?

Код, который я должен указать:

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared

Ответы [ 5 ]

1 голос
/ 16 июня 2009

Вы можете проверить, существует ли следующий раздел реестра

HKEY_CURRENT_USER\Software\Crystal Decisions

Это скажет вам, если Crystal Reports установлен. если вы хотите проверить конкретную версию, проверьте дочерний ключ. Например, отчеты о кристаллах, установленные с Visual Studio 2008, имеют размер 10,2

1 голос
/ 16 июня 2009

Я полагаю, Crystal устанавливается в GAC. Поэтому вам нужно программно просмотреть глобальный кэш сборок и найти там сборку Crystal

GAC может программно управляться через Windows API. Здесь вы найдете простую оболочку, которая позволяет управлять GAC из управляемого кода

Но я бы не советовал вам идти по этому пути. :)

Хорошим решением, как правило, является также проверка всех необходимых сборок во время установки программного обеспечения, я полагаю, что установщик Windows имеет функции для проверки сборок

Однако, это не всегда нормально. Предположим, вы хотите, чтобы пользователи запускали вашу программу даже без Crystal, но не разрешаете показывать отчеты, если Crystal не установлен.

В этом случае вам следует отделить все функциональные возможности отчетов от других форм. Вам следует создать отдельный проект с функциональностью Crystal Reports, назовем его MyReports. Только этот проект должен ссылаться на сборки Crystal, а другой - нет. Другие проекты также не должны напрямую ссылаться на MyReports.

И, наконец, вы должны использовать отражение для вызова средства просмотра отчетов, которое реализовано в MyReports из других проектов.

Обычно вы будете писать try / catch вокруг процедуры, в которой вы будете использовать отражение для загрузки сборки MyReports из файла. Таким образом, если Crystal или что-то еще не существует, он выдаст исключение, вы отобразите его пользователю, но остальные части программы будут работать.

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

1 голос
/ 16 июня 2009

В идеале вы должны позаботиться обо всех зависимостях вашего приложения во время установки и убедиться, что все необходимые компоненты уже установлены. Однако вы можете обернуть свой код, который вызывает соответствующие библиотеки DLL, в блок try..catch и перехватить исключение DllNotFoundException, когда оно будет сгенерировано.

0 голосов
/ 16 июня 2009

Используйте модуль слияния с вашими настройками. Sap есть список здесь:

Объединение модулей

0 голосов
/ 16 июня 2009

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

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

...