我们有一个实体框架项目,其中包含使用.NET 4和VS2010设置的多个模型。然后我们有几个项目需要使用这个实体项目。我们成功地将EF项目编译为DLL。我们还成功地将EF dll参考添加到多个项目中,这些项目运行良好。
问题是现在我们有几个程序(ASP.NET和控制台应用程序)引用这个EF dll并且dll在本地为每个调用程序复制,当我们对EF dll进行更改时,我们必须进入每个项目并用新版本替换EF dll。
我已经在多个项目中搜索共享库甚至EF项目。虽然我找到了几个,但我似乎无法找到一个很好的例子,我可以为我的情况工作,或者它不是那么老,以至于无关紧要。
这是我遇到的一般问题。为了更好地了解我遇到的问题,我将重点关注一个特定的项目。这是Intranet中的ASP.NET webform项目。如果我们添加EF dll引用并允许项目在本地复制dll,则EF可以很好地工作。但是,因为我们有多个项目,所以我们现在需要尝试将EF dll集中在可由多个进程共享的地方。我不是试图设置它,以便跨多个服务器访问一个EF dll。如有必要,我很乐意在各个服务器上安装DLL的副本。
我的愿望是创建一个共同的图书馆"每个服务器上的目录,简化示例" C:\ OurLibraries"。然后我们将或者EF dll(以及后来的其他人)放到这个文件夹中,并允许各种程序/进程访问EF dll的公共副本。我已经确定了本地副本" EF dll的内容已从Intranet项目中删除,并添加了对" C:\ OurLibraries \ OurEF.dll"的引用。文件。一切都很好,Intranet项目工作正常,直到它试图显示一个引用EF的页面,然后显示一条错误消息:
"无法加载类型' EntityNS.ProductDBEntity'。"
如果我打开"本地副本"在参考中,Intranet站点再次正常工作。我似乎无法找到允许我分享EF dll的魔法设置。
我根据各种帖子尝试了以下内容,但没有成功:
签署程序集并添加到GAC。遇到与在" C:\ OurLibraries"
添加" C:\ OurLibraries"目录到PATH环境变量。
在我的Intranet web.config文件中更改了EF的连接字符串,以删除" OR""从字符串: /Ecomedate.csdl |资源:///Ecomedate.ssdl |资源:///Ecomedate.msl;供应商=系统... 至 ;提供商=系统...
(基于这篇文章:Sharing Entity framework objects across projects?)
我花了很多时间研究这个并搜索论坛和帖子。我知道必须有一种方法来做这个,否则代码重用和DLL共享似乎没用,所以任何你可以建议的帮助将不胜感激。
以下是我所做的额外努力以及对目前为止的一些帖子的回应。
此外,这是我到目前为止在GAC中所经历的事情。 - 在安装了VS2010的计算机上,gacutil位于C:\ Program Files \ Microsoft SDK ...以及来自论坛的问题" gacutil"一般的基调是gacutil现在被认为是开发工具而不是用于生产环境。 Gacutil不是Server 2008或.Net 4框架的一部分,因此有关如何部署和处理GAC dll的若干建议
- 首先,使用gacutil安装旧方法,但是使用psexec复制并在生产服务器上调用gacutil。我可以让psexec从本地开发盒运行gacutil到prod服务器并获得返回代码0,成功,但是我找不到实际查看它安装在生产服务器上的方法,因为没有gacutil在prod服务器上,我无法使用像gacutil / l DataEntity.dll这样的内容来查看已安装dll的信息......如果它甚至安装正确的话。
- 我尝试将gacutil.exe和gacutil.exe.config文件复制到生产服务器,尝试从那里运行。当程序运行并提供gacutil的版本号时,它不会响应任何命令行开关,例如gacutil.exe / i DataEntity.dll或gacutil.exe / l DataEntity。它只是再次显示gacutil版本信息并停止。
- 有人在论坛上建议在prod机器上安装Microsoft SDK。虽然到目前为止我可能不得不考虑这个问题,但我真的不喜欢在我的生产环境中安装SDK的想法。
- 我试图查找远程GAC管理器等工具来查看和管理,但该开源项目的最后一次开发是2008年,所以当我尝试使用它来查看GAC时,它想要告诉我c: \ Windows \ assembly gac dlls,但.NET 4现在使用C:\ windows \ Microsoft.NET \ assembly来存储GAC dll,所以我似乎无法找到在远程生产服务器上查看或维护DLL的任何方法#39; s gac。如果我在命令提示符下的c:\ windows下运行dir DataEntity.dll / s命令,我会发现嵌入在C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL目录中的dll,但如果我试着查看通过C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL中的资源管理器文件,我看不到dll,所以我找不到允许我在C:\ Windows \ Microsoft中管理(安装,列出,卸载)DLL的工具服务器2008生产服务器上的.NET \ assembly \ GAC_MSIL。
- 有人建议通过拖放将dll安装到gac中。我正在尝试自动化我们的部署过程,因此必须手动拖放并没有多大意义。复制到C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL目录也可以吗?我已经尝试过了,但是因为我找不到一个可以让我看到已安装/注册的DLL的工具,我无法判断它是否有效。
- 另一个建议是创建一个只安装到GAC的安装程序。我尝试了这种方法并遇到了几个问题。首先,这是一个非常手动的过程。我无法弄清楚如何从GAC卸载旧的DLL然后在gac中安装新版本的DLL;它一直坚持我先卸载以前的安装。其次,当我尝试卸载dll时,它一直说它正在被另一个应用程序使用。我尝试重新启动然后卸载它,但没有去。我终于想通了它是IIS,不得不关闭IIS,卸载,重启,安装,然后重启IIS。这是一个痛苦,但尝试和自动化。
似乎应该有一种更好的方法将dll部署到生产环境到共享目录中。我只是想尝试将DataEntity.dll放在c:\ MyLibraries目录中,让进程访问DLL的一个副本。微软用C:\ Program Files \ Common Files做到了,所以它应该是可能的,但我现在花了几天时间试图找到一种可以大大减少GAC或安装程序选项所带来的维护工作的方法,减少重复dll的数量,如果允许在本地复制,则避免忽略更换dll。
答案 0 :(得分:1)
问题的最佳解决方案是使用Web Services
。为此目的创建了Web服务。您可以构建一个WCF服务库,然后在所有项目中使用它的方法。
祝你好运
答案 1 :(得分:0)
GAC方法可能是您所寻找的最接近的方法。由于您无法使GAC正常工作,因此您应仔细检查以确保遵循GAC中的安装说明。
答案 2 :(得分:0)
这可能看起来非常“外面”作为解决方案,但我们正在考虑使用Git存储库对多个服务器进行远程发布,Git存储库将使用最新的DLL(并且只有DLL)提交,然后推送到每个生产服务器/应用程序服务器。