Совместное использование Entity Framework Library между несколькими проектами - PullRequest
5 голосов
/ 04 марта 2012

У нас есть проект Entity Framework с несколькими моделями, настроенными с использованием .NET 4 и VS2010. Затем у нас есть несколько проектов, которые должны использовать этот объект сущности. Мы успешно скомпилировали проект EF в DLL. Мы также успешно добавили ссылку EF dll в несколько проектов, что прекрасно работает.

Проблема теперь в том, что у нас есть несколько программ (ASP.NET и консольные приложения), которые ссылаются на эту EF dll, и dll копируется локально для каждой вызывающей программы, когда мы вносим изменения в EF dll, тогда мы должны зайдите в каждый проект и замените EF DLL новой сборкой.

Я много занимался поиском общих библиотек и даже проектов EF в нескольких проектах. Несмотря на то, что я нашел несколько, я не могу найти хороший пример того, как я могу сделать работу для своей ситуации или что она не настолько стара, чтобы это не имело значения.

Это общая проблема, с которой я столкнулся. Чтобы лучше понять проблемы, с которыми я сталкиваюсь, я остановлюсь на одном конкретном проекте. Это проект веб-формы ASP.NET для внутренней сети. Если мы добавим ссылку на EF dll и позволим проекту скопировать dll локально, EF будет работать фантастически. Однако, поскольку у нас есть несколько проектов, теперь нам нужно попытаться централизовать DLL EF где-нибудь, где она может использоваться несколькими процессами. Я не пытаюсь настроить это так, чтобы один EF DLL был доступен на нескольких серверах. Я рад установить копию DLL на отдельных серверах, если это необходимо.

Мое желание - создать каталог «общие библиотеки» на каждом сервере, упрощенный пример «C: \ OurLibraries». Затем мы поместим dll или EF dll (и, возможно, другие позже) в эту папку и позволим различным программам / процессам получить доступ к общей копии dll EF. Я убедился, что «локальная копия» EF dll была удалена из проекта интрасети, и добавил ссылку на файл «C: \ OurLibraries \ OurEF.dll». Все прекрасно работает, и проект интрасети работает нормально, пока не попытается отобразить страницу, на которой есть ссылки на EF, а затем отобразит сообщение об ошибке:

"Не удалось загрузить тип EntityNS.ProductDBEntity."

Если я включу «локальную копию» в ссылке, сайт интрасети снова будет работать нормально. Кажется, я не могу найти ту магическую настройку, которая позволила бы мне поделиться EF dll.

Я пробовал следующие вещи, основанные на различных сообщениях, но безуспешно:

  • Подписание сборки и добавление в GAC. Возникла та же проблема, что и в "C: \ OurLibraries"

  • Добавление каталога "C: \ OurLibraries" в переменную среды PATH.

  • Изменена моя строка подключения для EF в моем файле web.config в интрасети, чтобы удалить "И" из строки: /Ecomedate.csdl | Рез: ///Ecomedate.ssdl | Рез: ///Ecomedate.msl; поставщик = System ... в ; Поставщик = System ...

(на основании этого поста: Совместное использование объектов инфраструктуры Entity в проектах? )

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

Вот дополнительные усилия, которые я предпринял и в ответ на некоторые посты до сих пор.

Также вот что я испытал с GAC до сих пор. - на компьютере с установленным VS2010 gacutil находится в C: \ Program Files \ Microsoft SDK ... и из форума по вопросам "Где gacutil" общий тон гласит, что gacutil теперь считается средством разработки и не предназначен для использования в продуктивных средах. Gacutil не является частью платформы Server 2008 или .Net 4, поэтому есть несколько предложений по развертыванию и работе с библиотеками GAC

  • во-первых, старый способ установки, используя gacutil, но используя psexec для копирования и вызова gacutil на производственном сервере.Я могу заставить psexec запустить gacutil из локального dev-сервера на prod-сервере и получить код возврата 0, успех, однако я не могу найти способ реально увидеть, что он установлен на рабочем сервере, потому что gacutil отсутствуетна сервере prod я не могу использовать что-то вроде gacutil / l DataEntity.dll для просмотра информации об установленной dll ... даже если она установлена ​​правильно.
  • Я попытался скопировать gacutil.exe и gacutil.exe.Конфиг файлы на рабочий сервер, чтобы попытаться запустить оттуда.Пока программа запускается и выдает номер версии gacutil, она не отвечает ни на какие параметры командной строки, такие как gacutil.exe / i DataEntity.dll или gacutil.exe / l DataEntity.Он просто снова отображает информацию о версии gacutil и останавливается.
  • Кто-то предложил на форуме установить Microsoft SDK на продакшн-машине.Хотя мне, возможно, придется учитывать это из-за отсутствия успеха, мне действительно не нравится идея установки SDK в моей производственной среде.
  • Я пытался найти такие инструменты, как Remote GAC Manager, чтобыпросматривать и управлять, но последней разработкой этого проекта с открытым исходным кодом была 2008 год, поэтому, когда я пытаюсь использовать его для просмотра GAC, он хочет показать мне c: \ Windows \ assembly gac dll, но .NET 4 теперь использует C:\ windows \ Microsoft.NET \ сборка для хранения библиотек GAC, поэтому я могу найти какой-либо способ просмотра или поддержки библиотек DLL на gac удаленного рабочего сервера.Если я запускаю команду dir DataEntity.dll / s в папке c: \ windows в командной строке, я обнаруживаю, что dll встроен в каталог C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL, но если я попытаюсь взглянуть нафайл через проводник в C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL, я не вижу DLL, поэтому я не могу найти инструмент, который позволяет мне управлять (устанавливать, просматривать, удалять) библиотеки DLL в C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL на производственном сервере server 2008.
  • Было предложено установить dll в gac с помощью перетаскивания.Я пытаюсь автоматизировать наш процесс развертывания, поэтому необходимость перетаскивания вручную не имеет большого смысла.Работает ли копия в каталоге C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL?Я попробовал это, но снова, так как я не могу найти инструмент, который позволил бы мне видеть установленные / зарегистрированные DLL, я не могу сказать, работал ли он или нет.
  • другое предложение было создать установщик, который будетпросто установите в GAC.Я попробовал этот метод и столкнулся с парой проблем.Сначала это был очень ручной процесс.Я не мог понять, как заставить его удалить старую DLL из GAC, а затем установить новую версию DLL в gac;он настаивал на том, чтобы я сначала удалил предыдущую установку.Во-вторых, когда я пытался удалить DLL, он продолжал говорить, что он используется другим приложением.Я попытался перезапустить и затем удалить его, но не пошел.Я наконец понял, что это был IIS, и мне пришлось завершить работу IIS, удалить, перезапустить, установить, а затем перезапустить IIS.Это боль, но пытаться автоматизировать.

Похоже, должен быть лучший способ развертывания библиотек DLL в производственной среде в общий каталог.Я просто хочу попробовать поместить DataEntity.dll в каталог ac: \ MyLibraries и получить доступ к этой копии DLL.Microsoft делает это с помощью C: \ Program Files \ Common Files, поэтому это должно быть возможно, но я потратил несколько дней, пытаясь найти способ, который бы значительно уменьшил усилия по обслуживанию, налагаемые GAC или установщиками, уменьшилколичество дублирующихся библиотек DLL и исключение возможности замены замещающих библиотек, если разрешено «локальное копирование».

Ответы [ 3 ]

1 голос
/ 04 марта 2012

лучшим решением для вашей проблемы является использование Web Services .web сервисов, созданных для этой цели. Вы можете создать библиотеку сервисов WCF и затем использовать ее методы во всех ваших проектах.

Удачи

0 голосов
/ 20 июня 2012

В качестве решения это может показаться довольно «оттуда», но мы рассматриваем возможность использования Git Repository для удаленной публикации на нескольких серверах, Git-репозиторий будет зафиксирован с самой последней DLL (и только DLL), затем отправляется на каждый рабочий сервер / сервер приложений.

0 голосов
/ 04 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...