问题标签 [global-assembly-cache]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 如何在生产中将 dll 部署到 GAC
我在 dev 中测试了 GAC,我用 gacutil 和 Visual Studio 的 CLI 安装了它。
对于生产,没有 Visual Studio 的 CLI 也没有 SDK(我认为)所以我的问题是
如何在没有 gacutil 的情况下将 dll 部署到 GAC?是否可以制作一种 exe 或 msi 将所有 dll 放到服务器和开发人员的通勤器上?
非常感谢帮助我
dll - 在 GAC 中加载 DLL
目前我在将 DLL 放入 Windows GAC 时遇到问题。我尝试按照此博客文章中所述创建 DLL 并加载它的步骤:http: //blogs.technet.com/b/cloudpfe/archive/2014/02/01/how-to-create-a-用于活动目录联合服务的自定义身份验证提供程序 3-0-part-2.aspx
在我尝试调用以下命令时:
我收到一条错误消息,告诉我找不到 System.EnterpriseServices:
使用“1”参数调用“加载”的异常:“无法加载文件或程序集‘System.EnterpriseServices,Version=4.0.0.0,Culture=neutral,PublicKeyToken=7514a164b89fa979’或其依赖项之一。系统找不到指定的文件。”
机器上确实存在指定的 DLL (System.EnterpriseServices)。
所以现在我的问题是,为什么这个方法不能找到 DLL,我必须做什么/改变才能让这个命令工作?
注意:我在仅安装了 ADFS 部件的普通 Windows Server 2012 R2 上进行了尝试;我已经从 Powershell 调用了该命令。
*更新: System.EnterpriseServices DLL 位于
C:\Windows\Microsoft.NET\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a
和
C:\Windows\WinSxS\amd64_system.enterpriseservices_b03f5f7f11d50a3a_4.0.9600.1638 4_none_53a3f9b13fac0ba5\
所以它应该可以从 GAC 获得。
.net - 无法使用 gacutil 将程序集安装到全局程序集缓存 (GAC)
我想在 Windows Server 2008 R2 上将程序集安装到全局程序集缓存 (gac)。自上次 Windows 更新以来,它无法正常工作。
例如,我采用 AjaxControlToolkit:
首先我使用工具 sn 检查它,然后我尝试使用 gacutil 使用 gacuil 和 -i 选项安装它。命令提示符显示以下内容:
对 sn 的检查表明,程序集一切正常,并且是正确的字符串签名。但尽管如此 gacutil 无法验证强名称签名。
.net - Newtonsoft Json.NET 版本不兼容(DLL 地狱)
Newtonsoft.Json 发布了具有相同强名称的不兼容版本,仅更改了文件版本。
根据MSDN:
具有相同强名称的程序集应该相同。
因此,如果我们无法控制的其他应用程序将不同版本的 Newtonsoft.Json.dll 放入 GAC,我们的应用程序就会中断。
有什么方法可以强制 .NET 加载我们需要的特定版本?
更新:
让我更深入地解释这个问题:
据我所知,在 .NET 中,在 CLR 尝试解析程序集并失败之前,没有解析程序集的机制。
只有 AppDomain.AssemblyResolve 事件,它仅在程序集未解析时触发。通常这就足够了。
但是在 Newtonsoft.Json 的情况下,它不会无法解析程序集,但它只是加载了错误的程序集。
发生这种情况是因为 Newtonsoft.Json 发布了具有相同强名称的不兼容版本。
例子:
假设我们的应用程序针对 NJdll 编译(程序集版本1.0,文件版本 1.0)
然后一些其他应用程序,将相同dll的其他不兼容版本放入GAC NJdll(程序集版本1.0,文件版本1.1)
因为它们只更改文件版本而不更改程序集版本,所以这两个程序集具有相同的强名称。
因此,对于我们试图解析 NJdll(程序集版本 1.0)的应用程序 .NET,它会在 GAC 中看到 dll 并加载它。(因为 .NET 总是更喜欢 GAC 中的程序集而不是“bin”文件夹中的程序集)
但是加载的程序集是错误的。它的文件版本为 1.1,与版本 1.0 不兼容。
因为这两个程序集具有相同的程序集版本,所以 .NET 看不到它们之间的任何差异。但是当它实际上试图解析内部的某个类或成员时,它失败了,因为它在 1.1 版中被更改了。
整个应用程序因不可预知的错误而失败。
最糟糕的是,即使我的应用程序没有将 newtonsoft.json.dll 放入 GAC,我无法控制的其他一些应用程序会将不同版本的 newtonsoft.json.dll 放入 GAC - 我的应用程序会因不可预知而中断例外。
所以我的问题是,在.NET 加载错误的程序集之前,我可以先加载正确的程序集吗?
更新
https://github.com/JamesNK/Newtonsoft.Json/issues/615 https://github.com/JamesNK/Newtonsoft.Json/issues/1001
与此问题有关的问题已通过评论结束,该评论表明 Newtonsoft.Json 的作者不了解 .NET 版本控制以及为什么这很重要。
c# - 升级到 Json.NET 7.0.1 导致安装错误
我在我的一个项目中使用 Json.NET,它的工作正常。但我最近只是想将相当过时的版本 4.5.9 更新到当前版本 7.0.1。你知道...只是为了跟上时代。
我通过 NuGet 安装了 4.5.9 版本,并且只使用了更新功能。
下一次部署后(我通过 Visual Studio 2012 内置 clickonce 部署),我的客户端电脑收到“需要在全局程序集 chache 中安装 XXX”错误,其中它引用了 Newtonsoft.Json DLL。
我不知道为什么或如何解决此错误。我已经设置了有关 Json.NET 的所有内容,以包括并要求在发布设置的应用程序文件对话框中。这并没有解决它。
卸载 7.0.1 并重新安装 4.5.9(全部通过 Nuget)可以修复错误。
为什么我不能在没有此错误的情况下部署 7.0.1 版本?
感谢您的关注。
c# - VS 2015 复制到项目引用的输出 GAC 引用,无论复制本地设置如何
我已经为这种行为提出了一个连接问题。
VS 2015
GAC
无论复制本地设置如何,都复制到项目引用的
输出引用。VS 2010
不使用相同的解决方案和项目,尊重复制本地属性。到目前为止,我发现的唯一解决方法是Microsoft.Web.Services3.dll
在项目 A 中添加对的直接引用并将其设置为复制 local = false。
重现步骤:
实际的:
Microsoft.Web.Services3.dll
正在复制到项目 A 的输出目录。
预期的:
Microsoft.Web.Services3.dll
没有被复制到项目 A 的输出目录中。
知道为什么会这样吗?MSDN 文档明确指出GAC
不应将依赖项复制到输出并尊重VS 2010
这一点。
.net - 不同分支/环境中的不同强名
我有一个“助手” dll,它已签名并放入我们服务器上的 gac 中,其他应用程序在其中执行并使用此助手组件。
这个场景被复制到多个环境中,例如:dev、qa、production。
例如,如果将辅助组件的“开发”版本意外部署到生产 GAC,我想“保护”例如生产应用程序以执行辅助组件。
我正在考虑在不同的分支(dev、qa、prod)中为帮助程序组件使用不同的 .snk(公钥令牌),以便针对生产组件构建的应用程序在尝试执行帮助程序的开发版本时会失败组件,因为程序集的强名称不同。
这是一个坏主意吗?还是有另一种(更好的)方法来实现这种“保护理念”?
asp.net - .NET 程序集未从 GAC 加载
我一天中大部分时间都在用头撞桌子,我这辈子都无法理解这一点。尝试使用它的 Web 应用找不到明显位于全局应用程序缓存中的程序集。我在网上可以找到的所有内容都假定或明确声明无法避免从 GAC 加载,这是全局和强制性行为。然而,就我而言,它似乎失败了。
.aspx 页面尝试使用它时出错:
更新:我尝试将丢失的 .dll 的“Copy Local”设置为“true”,以便将其包含在构建项目中。现在我得到一个不同的错误:
所以情况是,当 .dll 在项目中时,IIS 会同时找到该 .dll和GAC 一个,并抱怨冲突。当程序集不在项目中时,IIS 也找不到。此外,尝试打开错误消息显示的 GAC 路径 (c:\Windows\assembly\GAC_MSIL\CrystalDecisions.Web) 会出现“不存在”错误。
我比以前更失落。什么会导致这种奇怪的行为?
c# - 应用程序需要程序集...安装在全局程序集缓存中
我使用 C# 创建了一个窗口应用程序。我正在发布成功的应用程序。
我看到了一些关于设置项目的解决方案,它自动与下面相同
我不想将 dll 放在 GAC 中。
对此有任何建议或解决方案。
我浏览了以下网址
错误消息“无法安装或运行应用程序。应用程序需要 GAC 中的 stdole 版本 7.0.3300.0”
无法安装或运行应用程序:单击一次
.net - 防止 InstallShield 在更新时卸载 GAC 程序集
我有一个由我的 InstallShield 安装程序安装在 GAC 中的程序集。该组件被标记为永久,以便在卸载程序时保留 DLL。到目前为止,它工作正常。
但是,如果我更新程序,我希望我的 DLL 的两个版本存在于全局程序集缓存中:以前版本的 DLL 和新版本的 DLL(因为永久属性设置为 Y,以前版本不应卸载)。但事实并非如此:更新后仅存在最新版本。
我的理解是 InstallShield 为我的 DLL 分配了一个逻辑路径,例如。[GlobalAssemblyCache]MyAssembly.dll
,不管是什么版本。因此,即使 GAC 中有单独的路径,InstallShield 也会替换 GAC 中的 DLL。
我对行为的理解是否正确?无论如何,如何防止 InstallShield 删除我以前的版本?
谢谢,