将我的DLL部署到GAC以与ClickOnce App一起使用

时间:2009-07-08 19:01:23

标签: .net winforms dll clickonce gac

我该怎么办?我不应该有任何理由吗?

我有一个winform ClickOnce应用程序,它在DLL中有大约13mbs不是我的,所以我不需要/有能力定期更新它们。

DevExpress(3),Microsoft ReportViewer,Microsoft SQL Replication。 Microsoft SQL SMO。

如果没有将它们包含在我的ClickOnce应用程序中,我的整个程序大约需要1.5mbs,并且我们的远程站点的vpn连接有限,我真的需要将它放在那里。每次我做一个小的应用程序更改时,我都不能通过我们的网络向所有用户发送15mb。

由于


更新清晰度

澄清;我不想将我的DLL安装到GAC ClickOnce。 ClickOnce是我的主要应用程序需要使用的。我想从ClickOnce应用程序中删除这13个DLL并安装它们以便在所有本地系统上使用。

如果我能够通过GAC完成此任务,那太棒了。我只需要我的主应用程序三聚体更新。

6 个答案:

答案 0 :(得分:7)

扩展@ kanad的回复...

您的13MB dll只会在用户首次安装应用程序时下载。这是ClickOnce的一大优势,用户只需下载已更改的文件。

然而,令人困惑的是,ClickOnce进度对话框总是显示应用程序的整个大小,即使它可能没有下载整个应用程序。我做了大量的测试,以确保情况确实如此,并使用带宽监视器证明了这一点。

最后,如果您可以控制Web服务器,则可能需要考虑为ClickOnce应用程序启用压缩。它有助于大幅减少下载量。压缩是一种痛苦的设置,但this article应该让你开始。但是,再一次,压缩的大小不会反映在ClickOnce进度对话框中。

最好的办法就是忽略ClickOnce进度对话框中显示的数字:)

答案 1 :(得分:4)

Clickonce无法将文件安装到GAC中。您需要创建MSI或提升权限才能执行此操作。

通常,除非解决特定问题,否则应避免使用GAC。安装尺寸是否比ClickOnce下载更痛苦 - 使用50K调制解调器或高速LAN的用户?

Chris Sells有一篇很棒的文章,说明为什么你应该avoid the GAC,并且其上还有其他各种堆栈溢出帖子 - 请参阅hereherehere。< / p>

在一天结束时,您需要评估利弊,并确定最佳行动方案。

答案 2 :(得分:4)

这是我过去所做的,对我来说效果很好。我有ClickOnce应用程序在GAC中查找其中一些依赖项。事实上,它每次加载应用程序时都会检查。我使用一个简单的文件来查看依赖是否在GAC中。如果缺少依赖性,我会显示一条消息,表明您缺少某些依赖性以及有关如何修复它的一些说明。然后我发布并下载一个自解压exe程序,用于在GAC中安装依赖项。这是一个小Rube Goldbergen,但它对我来说效果很好。

对于可预见的未来第三方控件等,我只会在GAC中放置一些内容。

我有一个非常胖的客户端,其中包括MS Reporting,Infragistics和SMO等我们每周部署一个大约3.5MB的客户端。我们的许多用途都非常偏远,并且使用可以上网的数据卡。

答案 3 :(得分:3)

虽然其他答案是正确的,但ClickOnce只会下载一次DLL(如果它们没有更改)以解决您的直接问题,如果您要在ClickOnce流程之外的GAC中安装dll并且不想要要通过ClickOnce下载这些DLL,您可以执行以下操作。

通过在ClickOnce-&gt;应用程序文件设置中将这些DLL设置为必备,从ClickOnce下载中排除这些DLL。

执行此操作时,ClickOnce运行时将在下载之前检查GAC并确保存在这些DLL。

答案 4 :(得分:2)

根据Google nono here too.

您必须查看其他安装程序工具,例如创建MSI安装程序。这听起来很奇怪,但我解决安装大小的第一个想法是拥有两个安装程序。一个用于在GAC中安装依赖项,用户只需运行一次,另一个安装程序(我猜可以使用ClickOnce)来安装实际应用程序。使用此方法,理论上可以依赖较小的ClickOnce部署来进行所有未来的应用程序更新。

答案 5 :(得分:2)

如果每次下载完整的15 MB,你怎么知道? clickonce对话框总是说明,但它实际上并没有下载所有文件,只有那些哈希在清单中有变化的文件。 鉴于有可能从具有不同URL的CD进行部署以进行更新检查。这样您就可以第一次从CD安装,从那时起应用程序只能从您发布的站点更新自己。