将程序集部署为.Net Framework的一部分

时间:2018-06-27 08:42:12

标签: c# .net visual-studio assemblies gac

我有一个针对.NETFramework 4.0(使用强名)的程序集(MYASM.dll)

我想以某种方式将该程序集部署为目标计算机上.NETFramework的一部分(或整个系统认为它是)。

我的意思是:

  1. .NET运行时看到它,看到System.dll(无需本地部署或提供引用路径)
  2. 当我执行Model.CategoryID = Model.categoryModel[selectedIndex].ID; 时,MSBuild无需提示路径即可看到它
  3. 用户可以在Visual Studio中创建<Reference Include="MYASM" />,并且引入Add reference时无需使用强/全名

通过将其添加到GAC,我已经解决了1.(显然是2.)。但这显然是不够的。

通过将程序集放在特殊文件夹(<Reference Include="MYASM" />)中并设置RegistryKey [INSTALLFOLDER]\lib

,我已经部分解决了3。

然后我可以添加引用,但是我得到:
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\v4.0\AssemblyFoldersEx\MyAssemblies在我的csproj中,而不仅仅是我想要的<Reference Include="MYASM, Version=1.1, Culture=neutral, ..." />

使用第二种方法,如果我手动编辑csproj,一切正常,但是我不能要求用户这样做。

我在这里应该做什么?

[EDIT]很明显,我有自己的MSI。但是,我有。我没有用魔术棒控制用户的机器

3 个答案:

答案 0 :(得分:5)

不,您已尽其所能。 VS如何弄清楚将部分程序集名称放入项目文件中实际上并不那么明显。这不是公共代码,不能被篡改。非常确定它不会使用白名单,并且不会注意参考程序集的位置。

最可能的细节是程序集的PublicKeyToken。框架组合件始终必须具有相同的值b77a5c561934e089。 CLI规范(Ecma-335)中甚至规定了它的值。其次,很可能相距很远的地方是签名证书,该签名将程序集标识为Microsoft拥有。但是,两者都存在完全相同的问题,您无法获得强名称或签名程序集所需的私钥。它们被锁定在Redmond的一个库中,只有受信任的构建工程师才能访问它们。

您还忽略了另一个令人讨厌的小细节,您几乎不怕DLL Hell。冷酷的事实是,如果您在任何不受您控制的计算机上 ever 在GAC中公开程序集,那么您将永远无法再次更改它。您不能再修改程序集的公共接口。无法添加新的公共方法或类型,无法修改方法的参数和返回类型,无法添加枚举成员,等等。更糟糕的是,Microsoft担心的是,您无法真正更改私人和内部成员。程序员有一个技巧,可以使用Reflection来解决这个很棒的错误修复工具。但是至少您可以告诉他们“不要那样做!”。

进行此类修改需要来增加[AssemblyVersion]。现在,您将获得另一种类型的DLL Hell,该计算机可能尚未由安装程序更新。或更糟糕的是,解决方案使用具有不同引用的项目。 Microsoft必须通过修改CLR来解决框架程序集的此问题。自动将旧版本转发到新版本。可以在.NET 4.x项目中使用使用为.NET 2.0构建的程序集的基本原因。您自己的DLL无法获得这种服务。

“不要这样做”是唯一的好建议,但是遇到DLL Hell麻烦是我可以向任何人推荐的绝佳学习经验。必须经历地狱才能被恐惧。

最好的建议是发布Nuget程序包。它们正好相反,从未部署在GAC中,版本号变化非常快。但是在程序员需要时总是可用。

答案 1 :(得分:1)

有几种方法...

1)将创建一个新的设置,并将其打包为您所针对的框架。您可以打包并使用域控制器进行部署。当您的用户登录域时,将更新软件包,这样,您就可以将软件部署到特定用户或user groups。根据您的infrastructure,您将拥有可以使用的软件管理基础结构(包括2个链接)。

2)如果您以开发人员为目标,则创建一个NuGet软件包。如果您的组织托管您自己的NuGet服务器,则会限制分发。将Package源添加到Visual Studio,打开“选项页”,在搜索字段中键入NuGet,然后设置URL / UNC路径。

enter image description here

3)使用OneClick部署,这使您可以让应用程序下载更新的dll并将其安装在计算机上。它需要一个代码签名证书,但是您可能还是要对代码签名(如果这样做,最好使用防病毒工具)。

现在,链接MyAsam.dll将由应用程序链接定义或IoC容器完成。基本上,如果找到dll且未定义任何版本,它将采用发现的第一个,我认为顺序是1 AppFolder,2 GAC,3 Path(不确定)。这种“按您所能找到的东西”通常称为“ DLL地狱”,NuGet和OneClick解决方案在此方面效果最佳,因为您将始终获得适用于该应用程序的更新的dll。如果使用dll的Moe少于1个应用程序,并且两者都需要“正确”版本,而其中的“正确版本”不同,那么将DLL放入GAC将会出现问题。...

答案 2 :(得分:-1)

如果您具有MYASM.dll的源代码,那么我希望将项目引用添加到使用中的应用程序。这样做时,Visual Studio将为所有引用的项目创建一个GUID。