将dll部署到GAC

3
我们有一个Sharepoint 2010解决方案,正在尝试部署到生产环境。我们使用Visual Studio 2010开发了此解决方案,并创建了多个项目,这导致产生了许多dll文件。当访问其中一个Web部件时,我们遇到了以下错误:
“在请求的文件编译期间发生错误或其中一个依赖项。该类型'xxxx'是在未被引用的程序集中定义的。您必须添加对程序集'xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=xxxx'的引用。”
关于安装dll文件 - 我们已将它们拖放到GAC中。这是一个好方法吗?这可能是问题的原因吗?也许有更好的方式将其安装到GAC中?或者它们需要按特定顺序安装?先安装没有依赖关系的那个?
以下是来自日志文件的完整错误信息:
System.Web.HttpCompileException: c:\Windows\Microsoft.NET\Framework64\v2.0.50727\Temporary ASP.NET Files\root\6f2f2743\7b5d4663\App_Web_rxpractioncommonwpusercontrol.ascx.12f7e65c.q7c1p6i0.0.cs(134): error CS0012: The type 'xxxx' is defined in an assembly that is not referenced. You must add a reference to assembly 'xxxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=fe560f99f37381ef'. at System.Web.Compilation.AssemblyBuilder.Compile() at System.Web.Compilation.BuildProvidersCompiler.PerformBuild() at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildI... a47a805d-765d-429e-b080-fe031b3e4fac
感谢您的阅读。
Joseph

1
这是一个编程问题还是安装问题?你最好在ServerFault上问这个问题。 - Verbeia
3个回答

5
你应该使用Visual Studio 2010为你的SharePoint 2010解决方案创建WSP包。你可以将引用的程序集作为主要包的一部分包含在其中。要做到这一点,双击 SharePoint 项目中的 Package,并转到高级选项卡。从这里,你将能够将外部程序集包含到你的 WSP 中,或者自动包含解决方案中其他项目的输出。
如果你正在引用可被多个 WSP 解决方案共享的程序集,请注意以下特殊情况:当撤消 WSP 时,WSP 中包含的所有程序集也会被撤消,无论是否有另一个 WSP 也包含该程序集。
我的建议最佳实践是创建一个独立的 WSP 解决方案,其中仅包含程序集。创建一个新的空 SharePoint 项目。单击解决方案资源管理器中的项目,使用 F4 查看属性窗格。将“在包中包括程序集”设置为 false,将“程序集部署目标”设置为 GlobalAssemblyCache。然后双击包,在高级选项卡中添加你的程序集引用。
最终你将会有一个以上的 WSP 来部署你的解决方案,但这有助于以可靠的方式处理依赖关系。
永远不要将手动添加程序集到 GAC 作为生产部署方法!!

非常感谢您详细的回复。我将继续使用WSP进行GAC部署。之后会告诉您进展如何... - Joseph Caruana
如果我将“包含程序集在软件包中”的选项设置为false,则“程序集部署目标”会被禁用,我无法进行设置。请问您能否给予建议? - Joseph Caruana
1
我并不认为“程序集部署目标”需要到全局程序集缓存中,因为这是项目的实际dll,我不需要它在GAC中。 - Joseph Caruana
我已经将dll打包到WSP中并重新安装了WSP……但仍然收到相同的错误! - Joseph Caruana
您是正确的,我道歉。Assembly Deployment Target 只针对项目实际的 dll,而您不需要这个选项来使用 WSP 来打包其他的 dll。由于您仍然遇到错误,我已经发布了一个新答案,并提供不同的建议。 - Dennis George

3

由于您已经尝试从WSP部署程序集,我想列出另一种可能性作为新答案。首先,您需要明确缺少哪个程序集,然后验证该程序集是否存在于所有前端服务器的GAC中。您需要排除参考程序集确实不存在的任何可能性。可以使用如其他答案所述的融合日志查看器。

接下来,您的 Web 部件是如何开发的,您确定它是导致该错误的 Web 部件吗?具体而言,您是否在 Web 部件中使用任何 .ascx 标记来引用此“丢失”的程序集中的控件?如果是,则可能需要确保将 <%@ Assembly Name="" %> 指令添加到标记中,以便 asp.net 编译器知道在编译期间引用它。您还可能需要添加 SafeControl 条目。


再次感谢您的回复。我将使用Fusion日志查看器来调查这个问题。 - Joseph Caruana
1
只是为了更好地解释这个错误的背景......该dll是一个包含我们业务实体的类库。它是强类型的,在我们的开发环境中没有任何问题。然而,为了让它工作......我需要在web.config(程序集下)中添加以下条目。<add assembly="xxxxx,Version=1.0.0.0,Culture=neutral,PublicKeyToken=fe560f99f37381ef" /> - Joseph Caruana
没有这个条目,就会出现我在问题中所述的错误。但是,当我在生产环境中添加了该条目后,它仍然出现了错误。错误出在编译中。 - Joseph Caruana
我已经将错误添加到问题中。谢谢。 - Joseph Caruana
根据您的错误日志,正如我所怀疑的那样,您在WebPart中使用了ascx标记。请尝试在.ascx中添加<%@ Assembly %>指令以正确引用程序集,而无需在web.config条目中进行设置。您还验证了wsp部署后所有Web前端上是否存在该程序集吗? - Dennis George
显示剩余3条评论

2
将文本翻译成中文:

将程序集放入全局程序集缓存的首选方法是使用应用程序安装程序。请注意,您需要提升的权限才能将程序集安装到全局程序集缓存中。您还可以使用 Gacutil。

将程序集放入全局程序集缓存的顺序不重要。

根据错误提示,您可能缺少先决条件程序集 - 使用 FusLogVw 或类似 Reflector 的工具来确定未部署哪些依赖项。


谢谢您的回复。我会尝试获取更多信息,找出导致问题的dll,并从那里继续进行。 - Joseph Caruana
1
是的,融合日志查看器是一款很好的工具,可以确定哪个程序集被遗漏。然而,在生产SharePoint部署中,我建议不要使用gacutil。如果有多个前端服务器,您需要在每个服务器上执行相同的步骤,这容易出现人为错误。SharePoint WSP就是为此而设计的。 - Dennis George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接